fork () дочерний и родительский процессы - PullRequest
6 голосов
/ 01 сентября 2011

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

Это дочерний процесс. Мой pid - 733, а идентификатор моего родителя - 772.
Это родительский процесс. Мой pid - 772, а идентификатор моего ребенка - 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;
}

Это приводит к выводу:

Это дочерний процесс. Мой pid - 22163, а идентификатор моего родителя - 0.
Это дочерний процесс. Мой pid - 22162, а идентификатор моего родителя - 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 ]

13 голосов
/ 01 сентября 2011

Начните с чтения справочной страницы , а также getppid / getpid справочных страниц.

Из вилки

В случае успеха 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());
}

По вашему вопросу:

Это дочерний процесс. Мой pid - 22163, а идентификатор моего родителя - 0.

Это дочерний процесс. Мой PID 22162 и идентификатор моего родителя 22163.

fork() выполняется до printf. Таким образом, когда это будет сделано, у вас будет два процесса с одинаковыми инструкциями для выполнения. Следовательно, 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. Вторая строка - это родительский процесс, указывающий его идентификатор (22162) и его дочерний (22163).

2 голосов
/ 01 сентября 2011

Он печатает инструкцию дважды, потому что печатает ее как для родителя, так и для ребенка.Родитель имеет родительский идентификатор 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() );
1 голос
/ 27 марта 2018

Мы контролируем вызов процесса 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);
}
0 голосов
/ 23 июля 2014

Это правильный способ получения правильного вывода .... Однако идентификатор родительского потомка может иногда печататься как 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);
0 голосов
/ 01 сентября 2011

Он печатается дважды, потому что вы вызываете printf дважды, один раз при выполнении вашей программы и один раз в ответвлении. Попробуйте убрать fork () из вызова printf.

...