用系统 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)