在fork之前打开文件 fork之后子进程可不可以用这个文件描述符程序

在fork之前打开文件 fork之后子进程可不可以用这个文件描述符程序,第1张

1.fork()、文件和数据

用系统 fork() 建立的子进程几乎与其父进程完全一样。子进程中的所有变量均保持它们在父进程中之值(fork()的返回值除外) 。因为子进程可用的数据是父进程可用数据的拷贝,并且其占用不同的内存地址空间,所以必须要确保以后一个进程中变量数据的变化,不能影响到其它进程中的变量。这一点非常重要。另外,在父进程中已打开的文件,在子进程中也已被打开,子进程支持这些文件的文件描述符。但是,通过 fork()调用后,被打开的文件与父进程和子进程存在着密切的联系,这是因为子进程与父进程公用这些文件的文件指针。这就有可能发生下列情况:由于文件指针由系统保存,所以程序中没有保存它的值,从而当子进程移动文件指时也等于移动了父进程的文件指针。这就可能会产生意想不到到结果。为了说明上述情况,我们给出一个实例程序 proc_file。在这个程序中使用了两个预定义的函数 failure()和 printpos()。failure()用来完成简单的出错处理,它只是调用 perror() 来显示出错信息。其实现如下:

failure( char* s)

{

perror(s)

exit(1)

}

printpos()实现显示一个文件的文件指针之值,其实现如下:

printpos( char* string, int fildes)

{

long pos

if ((pos=lseek(fildes,0L,1)<0L)

failure( “ lseek failed” )

printf(“ %s: %ld \n” ,string,pos)

}

另外我们还假定文件 data 已经存在,并且它的长度不小于 20 个字符。下面给出程序proc_file 的清单:

#include

#include

#include

failure( char* s)

{

perror(s)

exit(1)

}

printpos( char* string, int fildes)

{

long pos

if ((pos=lseek(fildes,0L,1))<0L)

failure("lseek failed")

printf("%s: %ld \n",string,pos)

}

main()

{

int fd/* 文件描述符*/

int pid/* 进程标识符*/

char buf[10]/* 数据缓冲区*/

/* 打开文件*/

if ((fd=open(" data",O_RDONLY))<0)

failure("open failed")

read(fd,buf,10)/* advance file pointer */

printpos("Before fork",fd)

/* fork 新进程*/

if ((pid=fork())<0)

failure("fork failed")

else if (!pid)

/* 子进程*/

printpos("Child before read",fd)

read(fd,buf,10)

printpos("child after read",fd)

} else {

/* 父进程*/

/* 等待子进程运行结束*/

wait(NULL)

printpos("parent after wait",fd)

}

}

该程序运行结果如下:

Child before read: 10

child after read: 20

parent after wait: 20

这充分证明了文件指针为两个进程共用这一事实。

2.exec()和打开文件

当一个程序调用 exec 执行新程序时,在程序中已被打开的文件,其在新程序中仍保持打开。这就是说,已打开文件描述符能通过 exec 被传送给新程序,并且这些文件的指针也不会被 exec 调用改变。这儿,我们要介绍一个与文件有关的执行关闭位(close-on-exec ) ,该位被设置的话,则调用 exec 时会关闭相应的文件。该位的默认值为非设置。例行程序 fcntl 能用于对这一标志位的 *** 作,下面的程序段给出了设置“执行关闭”位的方法。

#include

int fd

fd=open(“ file ” ,O_RDONLY)

fcntl(fd,F_SETFD,1)

如果已经设置了执行关闭位,我们可以用下面的语句来撤销“执行关闭“位的设置,并取得它的返回值:

res =fcntl(fd,F_SETFD,0)

如果文件描述符所对应的文件的“执行关闭位”已经被设置,则 res 为 1,否则 res 之值为 0。

父进程在什么情况下可以相同

Liunx *** 作 - Record14—父子进程中的相同与不同 - 恋蛩音的博客 - CSDN博客

2020年2月16日进程共享 fork后: 父子相同处 全局变量、data、.text、栈、堆、环境变量、用户ID、宿主...

CSDN博客

父子进程 - 龙宇在天 - 博客园

2020年12月18日不同处:1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集 父子进程相同处和不同处是在只读情况下成立,...

博客园

父子进程同步 - Fitz1318的博客 - CSDN博客 - 父进程和子进程是同步的

1. 如果子进程还未结束,父进程阻塞等待

2. 如果子进程已经结束,其终止状态字SIGCHILD放在指定位置等待父进程提取,这时,父进程可立即得到终止状态字并返回

3. 如果没有子进程,父进程立即错误返回。

CSDN博客

Linux8 - fork父子进程逻辑地址相同、进程的逻辑地址与物理地址、fork相...

1. 正常释放结束子进程: 1、进程实体已经被释放2、PID内部的exit_code = 0//进程的退出码,将PID内部的退出码置零3

2. 非正常流程、僵死状态:没有获取退出码

CSDN博客

大家还在搜

父进程和子进程共享虚拟地址空间

父进程与子进程之间的关系

父子进程共享

并发指的是什么

父进程和子进程相同和不同

父进程如何创建子进程

父进程和子进程具有相同的

父子进程可以并发执行

...变量地址相同——虚拟内存 - Ethan - Code的博客 - CSDN博客 - 父进程...

5月6日会完全复制父进程的栈空间,包括页表,但没有复制物理页面,所以这时虚拟地址相同,物理地...

CSDN博客

父进程在创建子进程之后,哪些东西共享,哪些东西不共享?

1. 父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量

2. 父、子进程各自执行不同的程序段。这种情况下,在fork之后,多宝父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符

CSDN博客

fork之后父子进程虚拟地址(逻辑地址)相同的问题 - 飞雪一刀的博客 - CS...

2014年11月7日可以看到,两个进程中实例的虚拟地址都是一样的,但是实际上指向的是两个不同的变量(物理地...

CSDN博客

父子进程folk后的相同点不同点以及进程共享知识点 - 一头特立独行的驴...

2020年11月11日父子进程之间在刚fork 后: ​ 相同点:全局变量、.data、.text、栈、堆、环境变量、用户 ID、宿主目录、进程工作目录、信号处理方式… ...

CSDN博客

父子进程共享 - 一只小苹果的博客 - CSDN博客 - 父子进程共享

2020年12月3日父子进程不同(重点): 进程id 返回值 各自的父进程 进程创建的时间 闹钟 未决信号集 父子进程共享(重点): 1.文件描述符(fd) 2.mmap映射区...

CSDN博客

大家还在搜

子进程和父进程的理解

父进程和子进程哪些是共享的

父子进程可以同名吗

关于子进程和父进程的说法

用户级线程有没有线程控制块

一个进程可以没有父进程

以下关于父进程和子进程的叙述中

子进程会继承父进程的哪些内容

下一页

父进程在什么情况下可以相同

百度Liunx *** 作 - Record14—父子进程中的相同与不同 - 恋蛩音的博客 - CSDN博客

2020年2月16日进程共享 fork后: 父子相同处 全局变量、data、.text、栈、堆、环境变量、用户ID、宿主...

CSDN博客

父子进程 - 龙宇在天 - 博客园

2020年12月18日不同处:1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集 父子进程相同处和不同处是在只读情况下成立,...

博客园

父子进程同步 - Fitz1318的博客 - CSDN博客 - 父进程和子进程是同步的

1. 如果子进程还未结束,父进程阻塞等待

2. 如果子进程已经结束,其终止状态字SIGCHILD放在指定位置等待父进程提取,这时,父进程可立即得到终止状态字并返回

3. 如果没有子进程,父进程立即错误返回。

CSDN博客

Linux8 - fork父子进程逻辑地址相同、进程的逻辑地址与物理地址、fork相...

1. 正常释放结束子进程: 1、进程实体已经被释放2、PID内部的exit_code = 0//进程的退出码,将PID内部的退出码置零3

2. 非正常流程、僵死状态:没有获取退出码

CSDN博客

大家还在搜

父进程和子进程共享虚拟地址空间

父进程与子进程之间的关系

父子进程共享

并发指的是什么

父进程和子进程相同和不同

父进程如何创建子进程

父进程和子进程具有相同的

父子进程可以并发执行

...变量地址相同——虚拟内存 - Ethan - Code的博客 - CSDN博客 - 父进程...

5月6日会完全复制父进程的栈空间,包括页表,但没有复制物理页面,所以这时虚拟地址相同,物理地...

CSDN博客

父进程在创建子进程之后,哪些东西共享,哪些东西不共享?

1. 父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量

2. 父、子进程各自执行不同的程序段。这种情况下,在fork之后,多宝父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符

CSDN博客

fork之后父子进程虚拟地址(逻辑地址)相同的问题 - 飞雪一刀的博客 - CS...

2014年11月7日可以看到,两个进程中实例的虚拟地址都是一样的,但是实际上指向的是两个不同的变量(物理地...

CSDN博客

父子进程folk后的相同点不同点以及进程共享知识点 - 一头特立独行的驴...

2020年11月11日父子进程之间在刚fork 后: ​ 相同点:全局变量、.data、.text、栈、堆、环境变量、用户 ID、宿主目录、进程工作目录、信号处理方式… ...

CSDN博客

父子进程共享 - 一只小苹果的博客 - CSDN博客 - 父子进程共享

2020年12月3日父子进程不同(重点): 进程id 返回值 各自的父进程 进程创建的时间 闹钟 未决信号集 父子进程共享(重点): 1.文件描述符(fd) 2.mmap映射区...

CSDN博客

大家还在搜

子进程和父进程的理解

父进程和子进程哪些是共享的

父子进程可以同名吗

关于子进程和父进程的说法

用户级线程有没有线程控制块

一个进程可以没有父进程

以下关于父进程和子进程的叙述中

子进程会继承父进程的哪些内容

下一页

父进程在什么情况下可以相同

百度

在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。

关于Linux下系统,进程能最大能打开的文件描述符数看过好多文章,但大都没有完整,详细说明每个值表示什么意思,在实践中该怎么设置?

如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作?

max-file 表示系统级别的能够打开的文件句柄的数量,是对整个系统的限制,并不是针对用户的。

ulimit -n 控制进程级别能够打开的文件句柄的数量,提供对shell及其启动的进程的可用文件句柄的控制,这是进程级别的。

对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。

一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。

相关的3个文件:

/proc/sys/fs/file-max

/proc/sys/fs/file-nr

/etc/security/limits.conf

/proc/sys/fs/file-max

Linux系统级别限制所有用户进程能打开的文件描述符总数。

max-file 表示系统级别的能够打开的文件句柄的数量,是对整个系统的限制,并不是针对用户的。

/etc/security/limits.conf

用户级别的限制是通过可以通过命令ulimit命令和文件/etc/security/limits.conf

/proc/sys/fs/file-nr 该参数是只读的,不能修改。

file-nr的值由3部分组成:

1,已经分配的文件描述符数;

2,已经分配但未使用的文件描述符数;

3,内核最大能分配的文件描述符数

/proc/${pid}/fd

众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程所有打开的fd。

当然有些可能不是本进程自己打开的,如通过fork()从父进程继承而来的。

那么这个socket:后面的一串数字是什么呢?其实是该socket的inode号。

那么,知道了某个进程打开的socket的inode号后,我们可以做什么呢?

这就涉及到/proc/net/tcp(udp对应/proc/net/udp)文件了,其中也列出了相应socket的inode号通过比对此字段,我们能在/proc/net/tcp下获得此套接口的其他信息,如对应的<本地地址:端口号,远端地址:端口号>对,窗口大小,状态等信息。

具体字段含义详见net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函数。

如果socket创建了,没有被使用,那么就只会在/proc/pid/fd下面有,而不会在/proc/net/下面有相关数据。

目录中的每一项都是一个符号链接,指向打开的文件,数字则代表文件描述符。

其中0 = /dev/null ,1 = stdout, 2 = stderr,用cat或tail查看即可。

Number of file descriptors: different between /proc/sys/fs/file-nr and /proc/$pid/fd?

https://serverfault.com/questions/485262/number-of-file-descriptors-different-between-proc-sys-fs-file-nr-and-proc-pi

Linux中最大文件描述符数

https://leokongwq.github.io/2016/11/09/linux-max-fd.html

How do linux file descriptor limits work?

https://stackoverflow.com/questions/3991223/how-do-linux-file-descriptor-limits-work

limits.conf(5) - Linux man page

https://linux.die.net/man/5/limits.conf

Why can't I tail -f /proc/$pid/fd/1 ?

https://unix.stackexchange.com/questions/152773/why-cant-i-tail-f-proc-pid-fd-1

Linux查看进程运行输出(/proc/<pid>/fd)

https://blog.csdn.net/u014756245/article/details/120023188


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11833313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存