2017-02-22 22 views
1

Я пишу программу, которая создает два процесса непосредственно из родителя. Мой ожидаемый результат выглядитC Создание дочернего процесса

Main programs process ID: 2834 
Child 2 (ID: 2836) Start Sequence at: 23 
Child 1 (ID: 2835) Start Sequence at: 20 

Мой фактический выход

Main programs process ID: 2834 
Child 2 (ID: 2834) Start Sequence at: 23 
Child 1 (ID: 2835) Start Sequence at: 20 

Мой код

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    int n; 

    if (argc == 1) { 
     fprintf(stderr,"Usage: ./a.out <starting value>\n"); 
     return -1; 
    } 
    n = atoi(argv[1]); 

    int p_pid; 
    p_pid = getpid(); 

    printf("Main programs process ID: %d\n", p_pid); 

    pid = fork(); 

    if(pid == 0){ 
     int c1; 
     c1 = getpid(); 
     printf("Child 1 (ID: %d) Start Sequence at: %d\n", c1, n); 
    } 

    if(pid != 0){ 
     int c2; 
     c2 = getpid(); 
     printf("Child 2 (ID: %d) Start Sequence at: %d\n", c2, n+3); 
    } 
    return 0; 
} 

Я получаю правильный процесс ребенка 1, но не правильный процесс ребенка 2. Что я делаю неправильно или как я могу исправить эту проблему?

+0

код имеет только один вызов 'fork()', поэтому создается только один дочерний элемент. – user3629249

+0

ПРИМЕЧАНИЕ: функция: 'fork()' имеет три (3) вида возвращаемых значений. Опубликованный код проверяет только возврат '== 0', а затем предполагает, что ошибки не было. Это очень плохая практика программирования, чтобы не проверить ошибки. – user3629249

+0

основной процесс (родительский) не должен возвращаться, пока все дети не выйдут. Следовательно, родитель должен вызывать 'wait()' или better 'waitpid()' для каждого дочернего элемента до выхода родителя. – user3629249

ответ

4

fork() не создает 2 новых процесса. Он порождает 1 ребенка из основного процесса. Он возвращает 0 внутри дочернего процесса и PID дочернего элемента, если вы находитесь в родительском.

Так что в вашем коде, когда вы думаете, что у вас есть ребенок 2, это все еще родитель. Вам нужно будет снова позвонить fork(), но только внутри родительского процесса.

+0

, пожалуйста, просмотрите мои комментарии по вопросу о других проблемах с опубликованным кодом – user3629249

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