дочерние и родительские процессы 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);
}