#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. Спасибо, Джон, за объяснение