C语言在linux如何让子进程不继承父进程的资源

现在需要一个进程A运行另一个不相关的服务脚本来启动其他程序B,使用system()是用了fork来产生子进程B,但是这就造成了一个问题,B继承了A的资源,其中包括端口号,... 现在需要一个进程A运行另一个不相关的服务脚本来启动其他程序B,使用system()是用了fork来产生子进程B,但是这就造成了一个问题,B继承了A的资源,其中包括端口号,导致在A退出以后想要再次启动的话无法启动,虽然可以使用fcntl(fd,F_SETFD,FD_CLOEXEC);使子进程B不继承A的端口来解决,但并不是一个好的方案。
最好的方法是能够使B不继承A的任何资源,因为他们之间并没有什么关系,请问有什么办法可以实现?
是我说的不太清楚,A和B其实都是服务进程,程序C(可能是远程主机)随时可以通过A的监听端口发送消息来控制B的启动和停止(在A中运行"/etc/rc.d/init.d/Bd start"或"/etc/rc.d/init.d/Bd stop"),虽然正常情况下A和B都不会退出,但在某些情况下需要在B不停止的情况下升级A,就出现A不能启动的问题了。
因为此时A使用的端口还在被服务脚本Bd和initlog进程中打开着,虽然杀死Bd和initlog进程并不会对进程B本身造成影响,但是太不方便了。
展开
 我来答
kwydwuf
推荐于2016-05-26 · TA获得超过7409个赞
知道大有可为答主
回答量:1527
采纳率:71%
帮助的人:1990万
展开全部
我觉得这个问题你应该从另外一个方向去考虑,既然B不需要A的资源,那么就不要在fork之前打开这些资源。

你如,你原来的代码是

fd = open(...);
...
...
fork();
...
...

你现在就应该改成

fork();

if (parent)
{
......
fd = open();
.....
}
else
{
....
}

如果你是要在A进程打开资源,运行了一些东西,得到了足够的信息才需要调用其他啊程序来做下一步内容,如果按照上面的方法就无法实现了话,你面对的实际是进程间同步和通信的问题。 解决方法也很简单,随便通过一种通信机制(signal,pipe,等等),等A进程获得足够信息后,再通知B进程执行。比如

A:

fork();
/* below code are running in parent, A */
...
...
fd = open();
...
...
NOTIFY(B); /* use kill, send, etc. to notify child task B)
....

B:
WAIT(); /* for example, while(1) sleep(); */
execlp(xxx);
匿名用户
2010-05-29
展开全部
有更简单的方法,不用fork派生,直接用系统调用启动新的进程,至于需要继承的资源,考虑用写文件的方式进行过继
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
飞我一年
2012-04-11 · 超过31用户采纳过TA的回答
知道答主
回答量:107
采纳率:0%
帮助的人:68.5万
展开全部
exec函数族。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式