У меня есть программа, которая выполняет несколько программ в зависимости от меня. Смотрите следующий блок кода:
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. Однако при использовании vfork каждый дочерний элемент развивается из родительского дочернего элемента, см. Дерево 2. По моему мнению, с помощью fork () или vfork () дерево должно выглядеть как дерево ps 3.
С уважением