fork与操作文件的系统调用问题
1.打開文件
int open(const char* pathname, int flags)//用于打開一個已存在的文件
int open( const char* * pathname, int flags,mode_t mode);
//用于新建一個文件,并設置訪問權限
參數介紹:
pathname:將要打開的文件路徑和名稱
flags : 打開標志,如 O_WRONLY 只寫打開
O_RDONLY 只讀打開
O_RDWR 讀寫方式打開
O_CREAT 文件不存在則創建//注意不要寫出錯了,據說是當時寫內核的人寫錯了少些個E,所以本來是O_CREATE的變成了現在這樣。
O_APPEND 文件末尾追加
O_TRUNC 清空文件,重新寫入
mode: 權限 如:“0600”
返回值 :為文件描述符
2.讀文件
ssize_t read( int fd, void* buff, size_t count);
參數介紹:
fd 對應打開的文件描述符
buff 存放數據的空間
count 計劃一次從文件中讀多少字節數據
返回值:為實際讀到的字節數
3.寫文件
ssize_t write( int fd, const void* * buf, size_t count);
參數介紹:
fd 對應打開的文件描述符
buff 存放待寫入的數據
count 計劃一次向文件中寫多少數據
最后關閉文件close(fd)
4.父進程先打開一個文件,fork 后子進程是否可以共享使用?
代碼如下(test.txt的內容為abcdefg):
輸出內容為:
發現讀出內容是ab。可以確定,父子進程讀的是同一個文件,而且用的是同一個偏移量。也就是文件只被打開一次,供父子進程共享使用。
由于 fork 創建的子進程的 PCB 是拷貝父進程的,子進程的 PCB 中的文件表指向打開文件的指針只是拷貝了父進程 PCB 中的值(PCB與進程我們在計算機基礎中已經講了),所以父子進程會共享父進程 fork 之前打開的所有
文件描述符。如下圖所示:
5.系統調用與庫函數的區別
區別: 系統調用的實現在內核中,屬于內核空間;庫函數的實現在函數庫中,屬于用戶空間。
我們寫的fopen,fwrite這些都是庫函數,其內部實現都是利用系統調用open,write。
系統調用執行過程如下圖:
總結
以上是生活随笔為你收集整理的fork与操作文件的系统调用问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fork练习、从进程角度考虑堆区内存申请
- 下一篇: 孤儿进程和僵死进程处理方法