Проблема с выполнением нескольких процессов на c

#c #linux #process #ipc

#c #linux #процесс #ipc

Вопрос:

В настоящее время я пытаюсь создать 2 дочерних процесса, и каждый дочерний процесс что-то печатает, проблема в том, что один из процессов дважды печатает инструкции ‘printf’. вот код:

 #include <stdio.h>
#include <unistd.h>
int main(void)
{
    pid_t childPid[2];
    if((childPid[0] = fork()) == 0)
        printf("Hello I'm process onen");
    if((childPid[1] = fork()) == 0)
        printf("Hello I'm process twon");  
    return 0;
}
  

и вот результат после компиляции и запуска:

 Hello I'm process one
Hello I'm process two
Hello I'm process two
  

Пожалуйста, любое объяснение того, почему второй процесс был выполнен дважды.

Комментарии:

1. То, как вы это закодировали, приводит к тому, что первый дочерний процесс также вызывается fork . Итак, вы создаете более двух дочерних процессов.

2. OT: функция: fork() возвращает 3 вида информации: <0 означает, что произошла ошибка ==0 означает в дочернем процессе > 0 означает в родительском процессе. Ваш код должен проверять все 3 условия

Ответ №1:

После первого fork вызова первый дочерний процесс также продолжает выполнять остальную часть программы, т.е. как родительский, так и первый дочерний процессы вызываются fork снова.

Вам просто нужно выйти из первого дочернего процесса, чтобы только родительский вызывал второй fork:

 if((childPid[0] = fork()) == 0) {
    printf("Hello I'm process onen");
    exit(0);
}
  

Комментарии:

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

2. при выходе управление возвращается родительскому процессу

3. fork дублирует вызывающий процесс, и все, начиная с этого момента, будет выполняться в обоих процессах. «выход, возвращает управление родительскому процессу» — нет, выход просто завершает этот процесс — там нет «предоставления управления». Родительский процесс продолжает выполняться независимо. Выход заключается в том, чтобы предотвратить выполнение дочерним процессом остальной части программы.

Ответ №2:

В следующем коде вы создали дочерний процесс, и запущено 2 процесса, родительский и дочерний. Родительский процесс может быть идентифицирован по возвращаемому значению fork() , которое выводит сообщение, но НЕ завершается. Вот почему вы видите больше одного сообщения в следующем printf() результате.

 if((childPid[0] = fork()) == 0)
        printf("Hello I'm process onen");
  

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

 if((childPid[1] = fork()) == 0)
        printf("Hello I'm process twon"); 
  

Часто дочерний процесс выполняет дополнительное задание и возвращает результат, в то время как родительский процесс продолжает свой основной поток. Итак, в результате я предпочитаю писать,

 childPid[0]=fork();
if(childPid[0]<0)
{
  // error
}
else if(childPid[0] == 0) // following code would be executed by child process only
{
  printf("Hello I'm Child process twon");
  exit(EXIT_SUCCESS);
}

  

Комментарии:

1. Спасибо, Джон, за объяснение