linux如何让子进程不继承父进程的端口

solohac 2013-06-21 10:40:46
父进程:father(c++),调用第三方库创建监听端口,监听端口为随机,也就是father无法知道现在监听的是哪个端口。
子进程:child

father和child都一直运行,不退出。
father调用shell来启动child。
当father启动child(调用system接口),child会继承father的端口,那么当child需要使用端口时,也许会用到父进程的端口。

现在想让father的端口不被child继承,向大家请教。
...全文
2234 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeloas 2015-10-19
  • 打赏
  • 举报
回复
引用 2 楼 mymtom 的回复:
fcntl(fd, F_SETFD, FD_CLOEXEC);
父进程fork前,遍历下/proc/self/fd下的所有fd,给除了0,1,2以外的其他fd设置下FD_CLOEXEC,之后fork
钱吉 2015-10-19
  • 打赏
  • 举报
回复
在子进程运行开始处,把父进程的socket描述符close掉。问题是怎么找到父进程的socket句柄?
比较粗暴一点的做法是:把子进程当前已经打开的所有文件描述符(除了0,1,2),你可以通过遍历/proc/pid/fd目录获取所有文件描述符。当然更细一点的办法是:遍历的时候分析下描述符对应的软连接是不是指向一个socket,以免错杀无辜的描述符。代码就不给了,自己写吧,很简单。给一个参考链接:http://blog.chinaunix.net/uid-317451-id-92698.html
空的 2013-06-25
  • 打赏
  • 举报
回复
子进程直接把描述符关了不就完了,不影响父进程的
solohac 2013-06-24
  • 打赏
  • 举报
回复
引用 1 楼 heartlesstoanyone 的回复:
ose_on_exec 是一个进程所有文件描述符(文件句柄)的位图标志,每个比特位代表一个打开的文件描述符,用于确定在调用系统调用execve()时需要关闭的文件句柄(参见include/fcntl.h)。当一个程序使用fork()函数创建了一个子进程时,通常会在该子进程中调用execve()函数加载执行另一个新程序。此时子进程将完全被新程序替换掉,并在子进程中开始执行新程序。若一个文件描述符在close_on_exec中的对应比特位被设置,那么在执行execve()时该描述符将被关闭,否则该描述符将始终处于打开状态。 当打开一个文件时,默认情况下文件句柄在子进程中也处于打开状态。因此sys_open()中要复位对应比特
谢谢,涉及到的内容挺多,我找时间好好看看,最近比较忙
solohac 2013-06-24
  • 打赏
  • 举报
回复
引用 2 楼 mymtom 的回复:
fcntl(fd, F_SETFD, FD_CLOEXEC);
我的理解:如果我想设置一个socket,第一个参数就是socket的号,但是这个socket是调用底层库创建的,没有返回到上层。是不是就没有办法通过这个方法去设置?
mymtom 2013-06-24
  • 打赏
  • 举报
回复
fcntl(fd, F_SETFD, FD_CLOEXEC);
heartlesstoanyone 2013-06-21
  • 打赏
  • 举报
回复
ose_on_exec 是一个进程所有文件描述符(文件句柄)的位图标志,每个比特位代表一个打开的文件描述符,用于确定在调用系统调用execve()时需要关闭的文件句柄(参见include/fcntl.h)。当一个程序使用fork()函数创建了一个子进程时,通常会在该子进程中调用execve()函数加载执行另一个新程序。此时子进程将完全被新程序替换掉,并在子进程中开始执行新程序。若一个文件描述符在close_on_exec中的对应比特位被设置,那么在执行execve()时该描述符将被关闭,否则该描述符将始终处于打开状态。 当打开一个文件时,默认情况下文件句柄在子进程中也处于打开状态。因此sys_open()中要复位对应比特

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧