当前位置: 技术问答>linux和unix
exec后,原先打开的文件描述符是否会关闭?
来源: 互联网 发布时间:2015-06-25
本文导语: 我在一个线程里面,调用自定义的函数 my_system int my_system() { fork(); 子进程execl("2进制文件"); 父进程waitpid(); } 执行成功了. 如果按书上说的exec默认是保持描述符打开.应该不成功才对. 因为我的main里面,已经预先绑定...
我在一个线程里面,调用自定义的函数 my_system
int my_system()
{
fork();
子进程execl("2进制文件");
父进程waitpid();
}
执行成功了.
如果按书上说的exec默认是保持描述符打开.应该不成功才对.
因为我的main里面,已经预先绑定了4k的socket.
fork的进程,描述符应该不够用啊.好奇怪啊.
如果我把上面的my_system换成system,
会出错,原因是open too many files.
为什么我用execl就没有问题那?难道书上说的不对?
int my_system()
{
fork();
子进程execl("2进制文件");
父进程waitpid();
}
执行成功了.
如果按书上说的exec默认是保持描述符打开.应该不成功才对.
因为我的main里面,已经预先绑定了4k的socket.
fork的进程,描述符应该不够用啊.好奇怪啊.
如果我把上面的my_system换成system,
会出错,原因是open too many files.
为什么我用execl就没有问题那?难道书上说的不对?
|
描述符的确是不关闭(在不设置close_on_exec位的情况下),但是execl并没有产生新进程,只是在原进程的基础上替换了原有进程的正文而已,所以描述符的数量是不应该增加的。
而system却不同了,会产成新进程,并继承调用system的进程的所有描述符,所以会报too many的错,明白了?
而system却不同了,会产成新进程,并继承调用system的进程的所有描述符,所以会报too many的错,明白了?
|
system是通过一个shell来执行,大致应该是exec("sh")而你是直接exec(command)
|
mark