FORK()子进程对父进程打开的文件描述符的处理
总的来说,子进程将复制父亲进程的数据段,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()子进程对父进程打开的文件描述符的处理相关推荐
- 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这
线程共享的环境: 进程代码段.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯).进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的 ...
- 查看系统各个进程打开的文件描述符数量
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr 结果是以 打开的文件描述符数量:进程号 的格式排序的 .降序排序 转载于:https://blog. ...
- Linux中进程间传递文件描述符的方法
在进行fork调用后,由于子进程会拷贝父进程的资源,所以父进程中打开的文件描述符在子进程中仍然保持着打开,我们很容易的就将父进程的描述符传递给了子进程.但是除了这种情况下,如果想将某个父进程在子进程创 ...
- 不相干进程之间传递文件描述符
#include <sys/socket.h> #include <fcntl.h> #include <stdio.h> #include <unistd. ...
- Linux高级进程编程———在任意两个进程间传递文件描述符:使用 sendmsg 和 recvmsg 实现
进程间传递打开的文件描述符,并不是传递文件描述符的值.那么在传递时究竟传递了什么?我们要先搞明白这个问题. 1.文件描述符 文件描述符的值与文件没有任何联系,只是该文件在进程中的一个标识,所以同一文件 ...
- Linux 进程间传递文件描述符
文章目录 文件描述符 文件数据结构 共享文件 UNIX域socket实现传递文件描述符 进程间传递打开的文件描述符,并不是传递文件描述符的值.先说一下文件描述符. 文件描述符 对内核来说,所有打开的文 ...
- android进程间传递文件描述符原理
在Linux中,进程打开一个文件,返回一个整数的文件描述符,然后就可以在这个文件描述符上对该文件进行操作.那么文件描述符和文件到底是什么关系?进程使用的是虚拟地址,不同进程间是地址隔离的,如何在两个进 ...
- mysql 打开文件数_MySQL打开的文件描述符限制
如果遇到如下错误: Can't open file: '.\test\mytable.frm' (errno: 24) shell> perror 24 OS error code 24: To ...
- 进程间传递文件描述符--sendmsg,recvmsg(可用)
UNIX域套接字可以在同一台主机上各进程之间传递文件描述符. 下面先来看两个函数: #include <sys/types.h> #include <sys/socket.h> ...
最新文章
- Transformer 眼中世界 Vs. CNN 眼中世界
- pytorch view(): argument 'size' (position 1) must be tuple of ints, not Tensor
- ExtJs Grid 合计 [Ext | GridPanel | GridSummary]
- Mongodb 账户权限配置
- 主流视频客户端核心代码的实现
- 【BZOJ3144】[Hnoi2013]切糕 最小割
- 再学点分治——动态点分治
- java最新 学习路线
- Python软件安装教程
- 初学java socket编程实例代码讲解
- codeblock的汉化过程
- Spring实战(第5版)核心知识点总结
- Scrapy + selenium + 超级鹰验证码识别爬取网站
- OTA,一个万亿市场的风口
- php日期自动加一天,php 当前日期加一天和指定日期加一天
- linux 释放内存
- android音频焦点Audio Focus
- Mysql主从延时-Multi-threaded slave statistics for channel
- 【干货】Excel根据条件变换颜色
- 从自己挖的坑里爬出来