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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

父子进程共享文件

發布時間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 父子进程共享文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

父子進程共享文件

1、父進程和子進程可以共享打開的文件描述符。
2、父子進程共享文件描述符的條件:在fork之前打開文件。
3、對于兩個完全不相關的進程,文件描述符不能共享。
4、父子進程文件描述符是共享的,但是關閉的時候可以分別關閉,也可以同時在公有代碼中關閉。

Fork函數創建子進程后,子進程將復制父進程的數據段、BSS段、代碼段、堆空間、棧空間和文件描述符,而對文件描述符關聯的內核文件表項(struct file結構),則采用共享的方式。

父進程和子進程可以共享打開的文件描述符

/************************************************************************> File Name: IO_ptest1.c> 作者:YJK > Mail: 745506980@qq.com > Created Time: 2019年10月17日 星期四 20時56分57秒***********************************************************************/ #include<stdio.h> #include<fcntl.h> #include<unistd.h> #include<wait.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> int main(int argc,char *argv[]) {int fd,fd2=-1;int i;pid_t pid,pid_wait=-1;int status;char *buf="hello linux";char BUF[128]={0};if((fd=open("myfile",O_RDWR | O_TRUNC ))==-1)//open需要在fork之前{perror("open");exit(EXIT_FAILURE);}if((pid=fork())==-1){perror("fork");exit(EXIT_SUCCESS);}if(pid==0){if(write(fd,buf,strlen(buf))==-1){perror("write");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}else {pid_wait=wait(&status);//使父進程處于阻塞狀態 if((i=WIFEXITED(status)))//判斷是否正常退出{printf("child pid %d %d, normal exit,return value :%d\n",pid,pid_wait,i);}lseek(fd,-strlen(buf),SEEK_CUR);//子進程寫入數據,文件指針到達末尾需要重新定位if(read(fd,BUF,128)==-1)//讀取文件{perror("read");exit(EXIT_FAILURE);}printf("%s\n",BUF);close(fd);exit(0);} }

運行結果

如果將上述代碼稍微改動一下 將打開文件位于fork之后,并且不使用lseek對文件讀寫指針重新定位

/************************************************************************> File Name: IO_ptest1.c> 作者:YJK > Mail: 745506980@qq.com > Created Time: 2019年10月17日 星期四 20時56分57秒***********************************************************************/ #include<stdio.h> #include<fcntl.h> #include<unistd.h> #include<wait.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> int main(int argc,char *argv[]) {int fd,fd2=-1;int i;pid_t pid,pid_wait=-1;int status;char *buf="hello linux";char BUF[128]={0};if((pid=fork())==-1){perror("fork");exit(EXIT_SUCCESS);}if((fd=open("myfile",O_RDWR | O_TRUNC ))==-1)//open需要在fork之前{perror("open");exit(EXIT_FAILURE);}if(pid==0){if(write(fd,buf,strlen(buf))==-1){perror("write");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}else {pid_wait=wait(&status);//使父進程處于阻塞狀態 if((i=WIFEXITED(status)))//判斷是否正常退出{printf("child pid %d %d, normal exit,return value :%d\n",pid,pid_wait,i);}//lseek(fd,-strlen(buf),SEEK_CUR);//子進程寫入數據,文件指針到達末尾需要重新定位if(read(fd,BUF,128)==-1)//讀取文件{perror("read");exit(EXIT_FAILURE);}printf("%s\n",BUF);close(fd);exit(0);} }

運行結果

依舊會讀取出文件中的內容
原因分析:子進程的執行位置為fork返回處此時子進程打開”myfile”文件然后對其進行寫入數據操作,當子進程執行完畢,父進程由fork處返回,獲取子進程的PID,然后父進程又一次打開了”myfile”文件,那么父子進程對文件表的操作便是這樣

如果在子進程中打開文件,父子進程是否會共享文件呢?
由于fork 創建的子進程相當于父進程的一個副本,所以在子進程中打開一個文件并不會影響到父進程,而vfork與父進程共享內存那么在使用vfork創建的子進程中打開文件,父子進程能夠文件共享嗎

錯誤原因:一個錯誤的文件描述符
子進程打開文件返回一個文件描述符 使得fd=3,由于父子進程共享內存,父進程在使用這個文件描述符時,由于父進程中這個文件描述符并沒有打開任何文件,所以出現錯誤

文件描述符,文件表,inode節點表

第一種情況,一個進程中多次打開同一個文件,實現文件共享

第二種情況 兩個進程打開同一個文件,實現文件共享

第三種情況,使用dup復制文件描述符,實現文件共享

同時這種方式也是實現重定向編程的方法,在這里寫一個簡單的程序,將輸出內容寫入到文件中去

/************************************************************************> File Name: IO_dup.c> 作者:YJK > Mail: 745506980@qq.com > Created Time: 2019年09月27日 星期五 21時56分45秒***********************************************************************/ #include<stdio.h> #include<fcntl.h> #include<unistd.h> int main(int argc,char *argv[]) {int fd1,fd2=-1;fd1=open(argv[1],O_RDWR | O_CREAT,0777);if(fd1==-1){perror("open");return -1;}close(1);//關閉標準輸出 stdoutfd2=dup(fd1);//dup 系統自動分配 由小到大//fd2=dup(fd1,1);printf("fd2=%d\n",fd2);printf("---------------\n");close(fd1);return 0; }

運行結果

第四種,父子進程共享文件

總結

以上是生活随笔為你收集整理的父子进程共享文件的全部內容,希望文章能夠幫你解決所遇到的問題。

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