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

现在需要一个进程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本身造成影响,但是太不方便了。

我觉得这个问题你应该从另外一个方向去考虑,既然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);
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-29
有更简单的方法,不用fork派生,直接用系统调用启动新的进程,至于需要继承的资源,考虑用写文件的方式进行过继
第2个回答  2012-04-11
exec函数族。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网