Linux进程全解5——父子进程对文件的操作
来源:互联网 发布:阿里云客服报名入口 编辑:程序博客网 时间:2024/06/11 13:50
以下内容源于朱有鹏《物联网大讲堂》的课程学习,如有侵权,请告知删除。
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;}
阅读全文
0 0
- Linux进程全解5——父子进程对文件的操作
- 父子进程对文件的操作
- 父子进程对静态变量的操作不会相互影响
- Linux父子进程对键盘IO的管理 实验一则
- linux下父子进程间的通信——管道
- 初探Linux进程——僵尸进程和父子关系
- Linux进程全解9——进程状态、system函数、进程间的关系
- 多进程 fork之后父子进程 对文件描述符的作用
- 对fork()父子进程的一些理解
- 父子进程对信号的继承
- Linux进程全解3——进程概念、进程ID、多进程调度原理
- Linux进程全解10——守护进程
- linux 父子进程联系
- linux父子进程
- Linux父子进程同步
- linux进程创建(4)父子进程的缓存方式写文件
- 父子进程共享文件表的
- 神奇的linux:父子进程管道通讯
- 一个算法题
- JavaWeb集成百度UMEditor简易富文本编辑器
- POJ.3268 Silver Cow Party (Dijkstra)
- SSH框架总结(框架分析+环境搭建+实例源码下载)
- Java+Selenium3方法篇48-如何获取日期和时间
- Linux进程全解5——父子进程对文件的操作
- [bzoj4916]神犇和蒟蒻
- 复制操作符“operator=”注意事项
- 自我
- [Object-c] Log(输出数组和字典的中文内容)
- 文件以及日记查找
- 安卓事件分发机制简解
- C++中空类和空结构体大小的问题?
- Visual Studio 2015