2016-02-10 3 views
3

Я пытаюсь сделать простой тест, чтобы проверить, работают ли процессы одновременно.C Параллельные процессы

Вот то, что я до сих пор:

pid_t pids[argc-1]; 
pid_t pid; 

for(i=1; i<argc; i++) 
{ 
    pid = fork(); 
    if (pid > 0) 
    { 
     pids[i-1] = pid; 
     printf("process %d created\n", pid); 
    } 
    else 
    { 
     exit(0); 
    } 
} 

printf("Main Process\n"); 

for (i=0; i < argc - 1; i++) 
{ 
    int status; 
    wait(pids[i], &status, 0); 
    printf("Process %d finished\n", pids[i]); 
} 

Мой ARGC = 4 в этом случае, так это создает 3 дочерние процессы, именно то, что мне нужно.

Мой вопрос: как я могу быть уверен, что все процессы работают одновременно? Я пытался вызвать сон, но это не помогает, так как процессы создаются последовательно, и каждый сон заставляет их спать по одному. Я хотел, чтобы второй дочерний процесс спал (1), чтобы увидеть, будут ли другие два процесса печатать что-то, например, во время сна, но я не могу сделать это внутри цикла for.

Кроме того, почему «Основной процесс» напечатан только один раз? Разве не каждый процесс, после его завершения с циклом for, продолжает выполняться до выражения return? Я смущен этим.

Любая помощь будет высоко оценена.

Спасибо.

+0

есть еще один 'for' цикл внутри первого' for' петли для 'PID == 0 ' case (child case), который просто спит и печатает свой собственный pid. – kaylum

+0

После того, как вы раздвоены, порядок вывода является чисто случайным. – Koshinae

ответ

1

Детские процессы будут возвращаться от 0 до fork. Это означает, что они выполнит часть else вашего блока if, которая равна exit. Другими словами, каждый клиентский процесс выходит почти сразу после его запуска. Дети не печатают «Основной процесс», потому что они exit, прежде чем они туда доберутся.

Если вы хотите, чтобы дочерний процесс перестал спать, вызовите функцию sleep в дочерней части кода, то есть блок else.

Например, вы можете сделать что-то вроде этого:

... 
else 
{ 
    printf("in child %d\n", getpid()); 
    sleep(1); 
    printf("in child %d\n", getpid()); 
    sleep(3); 
    exit(0); 
} 

EDIT:

Я объясню более подробно именно то, что происходит:

На первой итерации цикла for , исходный процесс вызывает fork. Эта функция возвращается дважды: один раз для родителя, где он возвращает pid ребенка, и один раз для дочернего объекта, где он возвращает 0.

Родитель переходит в блок if, где он обновляет свой список сообщений и возвращается к началу цикла. Ребенок переходит к участку else, где он вызывает exit, который завершает дочерний процесс.

Исходный родительский процесс теперь является вершиной цикла for, и выше повторяется еще 3 раза.

+0

, но я все же создаю 3 дочерних процесса в этом случае. Потому что как насчет тех процессов, где pid> 0? Почему эти процессы не попадают в «Основной процесс»? –

+1

@ M.Averbach. Есть только один процесс, где pid> 0: оригинальный. Он выполняет цикл, а затем печатает «Основной процесс». – Gilles

+0

@ M.Averbach См. Мое редактирование для более подробной информации. – dbush

0

Как сказал М. Авербах, ваш опубликованный код выйдет так быстро, что было бы трудно определить их.Но на Ваш вопрос о том, как проверить, какие процессы запущены:

Однако, если процессы выжила немного дольше, вы можете обнаружить их с помощью основной команды «PS» может обеспечить вас выполняющимися процессами:

 ps

Если дочерние процессы могут иметь своих собственных детей, чем с помощью формы, которая показывает в виде дерева может быть полезным:

 ps jf
Смежные вопросы