日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

                    歡迎訪問 生活随笔!

                    生活随笔

                    當前位置: 首頁 > 运维知识 > linux >内容正文

                    linux

                    Linux进程全解5——父子进程对文件的操作

                    發布時間:2023/12/20 linux 29 豆豆
                    生活随笔 收集整理的這篇文章主要介紹了 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——父子进程对文件的操作的全部內容,希望文章能夠幫你解決所遇到的問題。

                    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。