总的来说,子进程将复制父亲进程的数据段,BSS段,代码段,堆空间,栈空间和文件描述符。而对于文件技术符关联内核文件表项(即STRUCT FILE结构),则是采取了共享的方式。

下面代码说明。

I值分离,但FD共享。

 1 [root@localhost ~]# vim fork_descriptor.c
 2 #include <stdio.h>
 3 #include <sys/types.h>
 4 #include <unistd.h>
 5 #include <fcntl.h>
 6 #include <string.h>
 7 #include <stdlib.h>
 8
 9 int main(int argc, char *argv[])
10 {
11     pid_t pid;
12     int fd;
13     int i = 1;
14     int status;
15     char *ch1 = "hello";
16     char *ch2 = "world";
17     char *ch3 = "IN";
18     if((fd = open("test.txt", O_RDWR | O_CREAT, 0644)) == -1)
19     {
20         perror("parent open");
21         exit(EXIT_FAILURE);
22     }
23     if(write(fd, ch1, strlen(ch1)) == -1)
24     {
25         perror("parent write");
26         exit(EXIT_FAILURE);
27     }
28     if((pid = fork()) == -1)
29     {
30         perror("fork");
31         exit(EXIT_FAILURE);
32     }
33     else if(pid == 0)
34     {
35         i = 2;
36         printf("in child\n");
37         printf("i = %d\n", i);
38         if(write(fd, ch2, strlen(ch2)) == -1)
39             perror("child write");
40         return 0;
41     }
42     else
43     {
44         sleep(1);
45         printf("in parent\n");
46         printf("i = %d\n", i);
47         if(write(fd, ch3, strlen(ch3)) == -1)
48             perror("parent write");
49         wait(&status);
50         printf("\n");
51         return 0;
52     }
53 }
54 "fork_descriptor.c" 53L, 945C written  

结果:

[root@localhost ~]# gcc -o fork_descriptor fork_descriptor.c

[root@localhost ~]# ./fork_descriptor

in child i = 2

in parent i = 1

[root@localhost ~]# cat test.txt

helloworldIN

FORK()子进程对父进程打开的文件描述符的处理相关推荐

  1. 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这

    线程共享的环境: 进程代码段.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯).进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的 ...

  2. 查看系统各个进程打开的文件描述符数量

    lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr 结果是以 打开的文件描述符数量:进程号  的格式排序的 .降序排序 转载于:https://blog. ...

  3. Linux中进程间传递文件描述符的方法

    在进行fork调用后,由于子进程会拷贝父进程的资源,所以父进程中打开的文件描述符在子进程中仍然保持着打开,我们很容易的就将父进程的描述符传递给了子进程.但是除了这种情况下,如果想将某个父进程在子进程创 ...

  4. 不相干进程之间传递文件描述符

    #include <sys/socket.h> #include <fcntl.h> #include <stdio.h> #include <unistd. ...

  5. Linux高级进程编程———在任意两个进程间传递文件描述符:使用 sendmsg 和 recvmsg 实现

    进程间传递打开的文件描述符,并不是传递文件描述符的值.那么在传递时究竟传递了什么?我们要先搞明白这个问题. 1.文件描述符 文件描述符的值与文件没有任何联系,只是该文件在进程中的一个标识,所以同一文件 ...

  6. Linux 进程间传递文件描述符

    文章目录 文件描述符 文件数据结构 共享文件 UNIX域socket实现传递文件描述符 进程间传递打开的文件描述符,并不是传递文件描述符的值.先说一下文件描述符. 文件描述符 对内核来说,所有打开的文 ...

  7. android进程间传递文件描述符原理

    在Linux中,进程打开一个文件,返回一个整数的文件描述符,然后就可以在这个文件描述符上对该文件进行操作.那么文件描述符和文件到底是什么关系?进程使用的是虚拟地址,不同进程间是地址隔离的,如何在两个进 ...

  8. mysql 打开文件数_MySQL打开的文件描述符限制

    如果遇到如下错误: Can't open file: '.\test\mytable.frm' (errno: 24) shell> perror 24 OS error code 24: To ...

  9. 进程间传递文件描述符--sendmsg,recvmsg(可用)

    UNIX域套接字可以在同一台主机上各进程之间传递文件描述符. 下面先来看两个函数: #include <sys/types.h> #include <sys/socket.h> ...

最新文章

  1. Transformer 眼中世界 Vs. CNN 眼中世界
  2. pytorch view(): argument 'size' (position 1) must be tuple of ints, not Tensor
  3. ExtJs Grid 合计 [Ext | GridPanel | GridSummary]
  4. Mongodb 账户权限配置
  5. 主流视频客户端核心代码的实现
  6. 【BZOJ3144】[Hnoi2013]切糕 最小割
  7. 再学点分治——动态点分治
  8. java最新 学习路线
  9. Python软件安装教程
  10. 初学java socket编程实例代码讲解
  11. codeblock的汉化过程
  12. Spring实战(第5版)核心知识点总结
  13. Scrapy + selenium + 超级鹰验证码识别爬取网站
  14. OTA,一个万亿市场的风口
  15. php日期自动加一天,php 当前日期加一天和指定日期加一天
  16. linux 释放内存
  17. android音频焦点Audio Focus
  18. Mysql主从延时-Multi-threaded slave statistics for channel
  19. 【干货】Excel根据条件变换颜色
  20. 从自己挖的坑里爬出来

热门文章

  1. CentOS 6.7 Gitolite 服务搭建及TortoiseGit配置连接
  2. codevs 1105 过河
  3. oracle client server那点事
  4. unity3d 动画中断并重新播放的解决办法
  5. 转载:CSS hack技巧大全
  6. Android memory
  7. Tungsten Fabric SDN — Overviw
  8. 好程序员web前端分享javascript枚举算法
  9. SSM整合Shiro 身份验证及密码加密简单实现
  10. 【VMware vSAN 6.6】5.1.基于存储策略的管理:vSAN硬件服务器解决方案