Linux进程全解5——父子进程对文件的操作
生活随笔
收集整理的這篇文章主要介紹了
Linux进程全解5——父子进程对文件的操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容源于朱有鵬《物聯網大講堂》的課程學習,如有侵權,請告知刪除。
1、子進程繼承父進程中打開的文件
(1)上下文:父進程先用open打開一個文件得到fd,然后再fork創建子進程,之后在父子進程中各自write向fd中寫入內容。
(2)測試結論是接續寫
- 因為父子進程之間的fd對應的文件指針是彼此關聯的(很像O_APPEND標志后的樣子)。
(3)實際測試時有時候會看到只有一個,有點像分別寫。但是實際不是,原因是見第2點。
2、父子進程各自獨立打開同一文件實現共享
(1)父進程open打開1.txt然后寫入,子進程打開1.txt然后寫入。
- 結論是分別寫。
- 原因是父子進程分離后,才各自打開1.txt,此時這兩個進程的PCB已經獨立了,文件表也獨立了,因此2次讀寫是完全獨立的。
(2)open時使用O_APPEND標志會如何?
- 實際測試結果表明,O_APPEND標志可以把父子進程各自獨立打開的fd的文件指針給關聯起來,實現接續寫。
3、總結
(1)父子進程間終究多了一些牽絆;
(2)父進程(在沒有fork之前)做的事情對子進程有很大影響,但是父進程(fork之后)在 if 里做的事情就對子進程沒有影響了。
- 因為fork已經復制父進程的PCB生成了一個新的子進程,并且fork返回時子進程已經完全和父進程脫離,并且獨立被OS調度執行。
(3)子進程最終目的是要獨立運行另外的程序。
附代碼
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h>int main(void) {// 首先打開一個文件int fd = -1;pid_t pid = -1;// fork創建子進程pid = fork();if (pid > 0){// 父進程中fd = open("1.txt", O_RDWR | O_APPEND);if (fd < 0){perror("open");return -1;}printf("parent.\n");write(fd, "hello", 5);sleep(1);}else if (pid == 0){// 子進程fd = open("1.txt", O_RDWR | O_APPEND);if (fd < 0){perror("open");return -1;}printf("child.\n");write(fd, "world", 5);sleep(1);//這里的sleep是防止其中一個進程結束后,另外一個進程還沒有寫,文件就close了。}else{perror("fork");exit(-1);}close(fd);/*// 首先打開一個文件int fd = -1;pid_t pid = -1;fd = open("1.txt", O_RDWR | O_TRUNC);if (fd < 0){perror("open");return -1;}// fork創建子進程pid = fork();if (pid > 0){// 父進程中printf("parent.\n");write(fd, "hello", 5);sleep(1);}else if (pid == 0){// 子進程printf("child.\n");write(fd, "world", 5);sleep(1);}else{perror("fork");exit(-1);}close(fd); */ return 0; }總結
以上是生活随笔為你收集整理的Linux进程全解5——父子进程对文件的操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装音乐软件下载,网易云音乐L
- 下一篇: docker查看java版本_Linux