以下内容源于朱有鹏《物联网大讲堂》的课程学习,如有侵权,请告知删除。

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——父子进程对文件的操作相关推荐

  1. Linux进程全解10——守护进程

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 一.守护进程介绍 1.进程查看命令ps ps -ajx偏向显示各种有关的ID号: ps -aux偏向显示进程各种占 ...

  2. Linux进程全解7——父进程wait / waitip回收子进程

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 一.wait介绍 1.wait的工作原理 (1)子进程结束时,系统向其父进程发送SIGCHILD信号: (2)父进 ...

  3. 菜鸟必看:wndows xp进程全解

    菜鸟必看:wndows xp进程全解 system process  进程文件: [system process] or [system process]  进程名称: Windows内存处理系统进程 ...

  4. w ndows进,菜鸟必看:wndowsxp进程全解(四)

    loadqm.exe 进程文件: loadqm or loadqm.exe 进程名称: MSN Queue Manager Loader 描述: MSN Queue Manager Loader被随着 ...

  5. linux 解压rar格式的文件怎么打开,linux服务器怎么解压rar格式的文件

    做seo的很多人都会经历过这个问题,那就是安装的宝塔.wdcp等面板后,但是在上传完压缩文件的时候,发现压缩文件是rar后缀的压缩文件,在宝塔面板中就解压不了rar文件. 一.于是就想着把后缀改为zi ...

  6. Linux 下载安装 rar 并解压rar压缩包(Linux下如何解压.zip和.rar文件)

    Linux下如何解压.zip和.rar文件,对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们: 1)对于zip linux下提供了zip和unzip程序,zip是 ...

  7. linux环境编程 学习,学习linux环境高级编程首先学习的是文件的操作。因为有.pdf...

    学习linux环境高级编程首先学习的是文件的操作.因为有 学习 Linux 环境高级编程,首先学习的是文件的操作.因为有一句很有趣的话"Linux 下一切皆文件".所以掌握了文件操 ...

  8. linux应用编程和网络编程-3.4.linux进程全解- 父子关系 exec system函数

    程序的开始和结束 编译链接时的引导代码(构建执行环境)调用main函数 ①编译链接时的链接器:将编译器中引导代码给连接进去和应用程序一起构成最终的可执行程序. ②运行时的加载器:将这个程序加载到内存中 ...

  9. 【linux应用编程】-进程全解

    第一点 程序的开始和结束 程序的开始 在操作系统中的应用程序其实在main函数执行前也是需要先执行一段引导代码的,但是我们在写代码之前完全不用考虑引导代码的问题,因为这些都由内部封装完成! 上述的这些 ...

最新文章

  1. 开源、开放网络和SDN三者区别—Vecloud微云
  2. 【LeetCode笔记】剑指 Offer 65. 不用加减乘除做加法(Java、位运算、二刷)
  3. oracle 11g ocp 笔记(14)--数据库备份和恢复配置
  4. Linux服务器创建及维护记录
  5. matlab二维傅里叶变换ffshift,形象理解二维傅里叶变换
  6. concat函数_《MySQL 入门教程》第15篇MySQL常用函数之字符函数
  7. uniAPP上架iOS商店踩到的坑(记录)
  8. 自动化功能测试平台TestComplete的分布式测试教程(一)
  9. Unity编辑器扩展——在Editor下动态添加监听事件
  10. 游戏编辑器制作(8)
  11. 冬色烂漫 纯情踏雪 论著名画家冯庆冰雪画作品
  12. UEFI与 Legacy BIOS两种启动模式详解
  13. Visio画UML类图
  14. 2019年国考行测错题集(省级)
  15. 1752年9月-----消失的那11天
  16. 电脑主机由哪几个重要的组成部分
  17. 字节跳动面试真题:阿里P7级别面试经验总结,满满干货指导
  18. 美国计算机访学,美国博世研究与技术中心招聘计算机科学与统计学方向博士后和访问学者...
  19. sybase常用命令
  20. 蓝牙耳机音质不好怎么办?老司机私藏煲机小技巧,拯救你的Partner!

热门文章

  1. PowerDesigner表结构和字段大小写转换
  2. sorted_一个函数秒杀冒泡排序算法和选择排序
  3. mysql5.5提示Deprecated: mysql_query(): The mysql extension is deprecated
  4. Java Experiment 3 PairProgramming
  5. Android Studio 1.1的安装和遇到的坑
  6. 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换
  7. .NET:如何让线程支持超时?
  8. HDU 1000 A + B Problem
  9. 迭代之嵌套的for循环
  10. 使用FTP获取RFC文档