дочерние и родительские процессы fork()
Я пытаюсь создать программу, которая использует fork () для создания нового процесса. Выход образца должен выглядеть так:
это дочерний процесс. Мой pid-733, а id моего родителя-772.
Это родительский процесс. Мой pid-772, а id моего ребенка-773.
вот как я закодировал свою программу:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("This is the child process. My pid is %d and my parent's id is %d.n", getpid(), fork());
return 0;
}
это приводит к выходу:
это дочерний процесс. Мой пид 22163 и ID моих родителей-0.
Это дочерний процесс. Мой pid-22162, а id моего родителя-22163.
почему он печатает оператор дважды и как я могу заставить его правильно показать идентификатор родителя после отображения идентификатора ребенка в первом предложении?
EDIT:
#include <stdio.h>
#include <stdlib.h>
int main() {
int pid = fork();
if (pid == 0) {
printf("This is the child process. My pid is %d and my parent's id is %d.n", getpid(), getppid());
}
else {
printf("This is the parent process. My pid is %d and my parent's id is %d.n", getpid(), pid);
}
return 0;
}
5 ответов
начните с чтения вилка man page а также getppid / getpid man страницы.
от
при успешном выполнении PID дочернего процесса возвращается в Родительском поток выполнения, и 0 возвращается в поток ребенка исполнение. При сбое в Родительском контексте будет возвращен -1, дочерний процесс не будет создан, и errno будет установлен соответственно.
так что это должно быть что-то вроде
if ((pid=fork())==0){
printf("yada yada %u and yada yada %u",getpid(),getppid());
}
else{ /* avoids error checking*/
printf("Dont yada yada me, im your parent with pid %u ", getpid());
}
что касается вашего вопроса:
это дочерний процесс. Мой пид 22163 и ID моих родителей-0.
это дочерний процесс. Мой пид 22162 и удостоверение родителя 22163.
fork()
выполняется перед printf
. Поэтому, когда это сделано, у вас есть два процесса с одинаковыми инструкциями для выполнения. Поэтому, е выполню дважды. Вызов fork()
вернутся 0
к детскому процессу и pid
дочернего процесса к родительскому процессу.
вы получаете два запущенных процесса, каждый из которых будет выполнять это - инструкции о себе:
printf ("... My pid is %d and my parent's id is %d",getpid(),0);
и
printf ("... My pid is %d and my parent's id is %d",getpid(),22163);
~
чтобы обернуть его, вышеуказанная строка является дочерней, указывая ее pid
. Вторая строка является родительским процессом, указывая его id (22162) и его дочерний (22163).
он печатает оператор дважды, потому что он печатает его как для родителя, так и для ребенка. У родителя есть идентификатор родителя 0
попробуйте что-то вроде этого:
pid_t pid;
pid = fork();
if (pid == 0)
printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(),getppid());
else
printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), getppid() );
он печатает дважды, потому что вы вызываете printf дважды, один раз при выполнении вашей программы и один раз в вилке. Попробуйте взять свою вилку () из вызова printf.
это правильный способ получения правильного вывода.... Однако Родительский идентификатор ребенка может иногда печататься как 1, потому что родительский процесс завершается, и корневой процесс с pid = 1 управляет этим сиротским процессом.
pid_t pid;
pid = fork();
if (pid == 0)
printf("This is the child process. My pid is %d and my parent's id
is %d.\n", getpid(), getppid());
else
printf("This is the parent process. My pid is %d and my parent's
id is %d.\n", getpid(), pid);
мы контролируем вызов процесса fork () оператором if, else. См. мой код ниже:
int main()
{
int forkresult, parent_ID;
forkresult=fork();
if(forkresult !=0 )
{
printf(" I am the parent my ID is = %d" , getpid());
printf(" and my child ID is = %d\n" , forkresult);
}
parent_ID = getpid();
if(forkresult ==0)
printf(" I am the child ID is = %d",getpid());
else
printf(" and my parent ID is = %d", parent_ID);
}