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本身造成影响,但是太不方便了。 展开
最好的方法是能够使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);
你如,你原来的代码是
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);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询