gpt4 book ai didi

c - switch 中的多个 fork() 导致指数执行

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:07 25 4
gpt4 key购买 nike

我有一个程序根据 i 执行多个程序。请参阅以下代码块:

for(i=0;i<5;i++){
switch(i){
case 0:
if(fork())result=execl(transportProtoSnd,transportProtoSnd,RTPport, NULL);
if(result<0){printf("ERRNO: %d\n", errno);exit(0);}
break;
case 1:
if(fork())result=execl(fecSnd,fecSnd,RTPport-1, nameOfTransportProto, NULL);
if(result<0){printf("ERRNO: %d\n", errno);exit(0);}
break;
case 2:
if(fork())result=execl(fecRcv,fecRcv,RTPport-2, nameOfTransportProto, NULL);
if(result<0){printf("ERRNO: %d\n", errno);exit(0);}
break;
case 3:
if(fork())result=execl(transportProtoRcv,transportProtoRcv, RTPport-3, NULL);
if(result<0){printf("ERRNO: %d\n", errno);exit(0);}
break;
}
}

问题是进程树看起来像:

0:00  \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly Tests/NfqVerdictOnly 
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly

通过使用 vfork() 我得到了更好的行为:

0:00  \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly Tests/NfqVerdictOnly 
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly
0:00 | \_ NfqCallTracking/NfqCallTracking 0 Tests/NfqVerdictOnly

但实际上它应该是这样的:

0:00 udevd --daemon
0:00 \_ udevd --daemon
0:00 \_ udevd --daemon

IIRC vfork() 不使用父进程的状态。因此,我防止了 ps 树 1 中的指数 fork 。但是使用 vfork,每个子节点都从父子节点进化而来,请参见树 2。在我看来,通过使用 fork() 或 vfork(),树应该看起来像 ps 树 3。

亲切的问候

最佳答案

实际上,这是正在发生的事情。

if(fork())result=execl(transportProtoSnd,transportProtoSnd,RTPport, NULL);
if(result<0){printf("ERRNO: %d\n", errno);exit(0);}

父进程 fork 并立即执行(当然永远不会返回)。这就是 if 所做的。然后, child 测试了一个伪造的结果值,并继续生成另一个程序 (i++)。

所以主要问题似乎是您在父级而不是子级执行(这很奇怪)。你应该做这样的事情:

if(fork() == 0) {
execl(transportProtoSnd,transportProtoSnd,RTPport, NULL);
/* If it reaches this handle error. */
}

显然,您应该检查 fork(2) 的返回码。

关于c - switch 中的多个 fork() 导致指数执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6996613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com