execl выполняется только один раз в разветвленном процессе, программирование на C - PullRequest
1 голос
/ 09 мая 2011

По какой-то причине, о которой я не знаю, мое единственное мое первое выражение execl выполняется в следующем коде:

pid = fork();
if(pid < 0){
    fprintf(stderr, "Fork Failed.\n");
    exit(1);
    return;
}else if(pid==0){
        if(execl("/home/tropix/hw11-2","/home/tropix/hw11-2",semarg,pipe_to_p3,pipe_to_p4,(char*)0)){
            fprintf(stderr, "File Exexecution of hw11-2 failed.\n");
            exit(1);
        }
        if(execl("/home/tropix/hw11-3","/home/tropix/hw11-3",shmarg,semarg,pipe_from_p2,pipe_to_p5_1, (char*)0)){
            fprintf(stderr, "File Execution of hw11-3 failed.\n");
            exit(1);
        }
        if(execl("/home/tropix/hw11-4","/home/tropix/hw11-4",shmarg,semarg,pipe_from_p2_2,pipe_to_p5_2, (char*)0)){
            fprintf(stderr, "File Execution of hw11-4 failed.\n");
            exit(1);
        }
        if(execl("/home/tropix/hw11-5","/home/tropix/hw11-5",semarg,pipe_from_p3,pipe_from_p4,(char*)0)){
            fprintf(stderr, "File Execution of hw11-5 failed.\n");
            exit(1);
        }
} else (...parent stuff...)

У кого-нибудь есть идеи относительно того, почему это так?

Спасибо:)

Ответы [ 3 ]

3 голосов
/ 09 мая 2011
2 голосов
/ 09 мая 2011

Семейство функций exec работает, заменяя ваш процесс тем, который вы указали, поэтому функция никогда не вернется в случае успеха.

0 голосов
/ 09 мая 2011

Как говорят другие ответы, exec* замените текущий образ процесса новым, поэтому вам нужно fork() один раз для каждого exec*(), если вы хотите порождать несколько дочерних процессов.

...