文件描述符
非負(fù)整數(shù), 默認(rèn)使用最小的可用的整數(shù)
0,1,2 對應(yīng) STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO
讀寫函數(shù)
#include<unistd.h>
- int open(const char path,int oflag ... /mode*/);?oflag: ?5必須選1: O_RDONLY, O_WRONLY, O_RDWR, O_SEARCH, O_EXEC
可選: O_APPEND, O_CREAT, O_EXCL, O_SYNC, O_TRUNC?
eg O_WDONLY | O_CREAT | O_TRUNC - int close(int fd);
- off_t lseek(int fd, off_t offset, int whence)?whence: SEEK_SET, SEEK_CUR, SEEK_END 錯誤則返回-1?offset 可負(fù), 可以超過文件大小, 在超過文件大小后寫,會形成空洞, 用\0填補(bǔ),但是不占用磁盤塊
- ssize_t read(int fd, void *buf,size_t nbytes);?if未到EOF,則讀取nbytes,返回nbytes, 否則剩多少,讀多少,返回多少(到EOF就是0)
- ssize_t write(int fd, void buf,size_t nbytes);?io效率*: buf設(shè)置為4096及更大效率較高
進(jìn)程文件結(jié)構(gòu)
image.png
image.png
文件共享
image.png
原子操作
一般有多個函數(shù)的操作,, 不是原子操作, 多進(jìn)程運(yùn)行時可能出錯,比如
seek pointer to end
write
單進(jìn)程沒有問題, 而多進(jìn)程訪問同一個文件, 而不是同一個文件描述符時, 比如a,b訪問f
當(dāng)a執(zhí)行完seek到end后 ,寫指針在n, b執(zhí)行seek to end 然后寫至x bytes,此時文件指針已經(jīng)到n+x, 但是a會在n處繼續(xù)執(zhí)行寫,然后就覆蓋了bxx的內(nèi)容
復(fù)制文件描述符dup dup2
#include<unistd.h>
int dup(int fd); // copy fd
int dup2(int fd,int fd2)
// close fd2 and open fd, note it's an atomic op
//if fd2==fd : return fd2
image.png
參考資料: UNIX環(huán)境高級編程 W.Richard Stevens, Stephen A. Rago