вывод процесса разветвления - PullRequest
0 голосов
/ 13 октября 2011

Привет всем, кого я хочу задать вопрос о разветвлении

вот код

#include  <stdio.h>
#include  <string.h>
#include  <sys/types.h>

#define   MAX_COUNT  5
#define   BUF_SIZE   100

void  main(void)
{
     pid_t  pid;
     int    i;
     char   buf[BUF_SIZE];

     fork();
     pid = getpid();
     for (i = 1; i <= MAX_COUNT; i++) {
          sprintf(buf, "This line is from pid %d, value = %d\n", pid, i);
          write(1, buf, strlen(buf));
     } 
     printf("child id :%d\n" , pid);

     printf("parent id :%d\n" , getppid());
}

и когда я запускаю его здесь, вывод

This line is from pid 31130, value = 1
This line is from pid 31130, value = 2
This line is from pid 31130, value = 3
This line is from pid 31130, value = 4
This line is from pid 31130, value = 5
child id :31130
This line is from pid 31131, value = 1
parent id :31052
This line is from pid 31131, value = 2
This line is from pid 31131, value = 3
This line is from pid 31131, value = 4
This line is from pid 31131, value = 5
child id :31131
parent id:31130

меня действительно смутило, почему

  1. идентификатор родительской строки и идентификатор потомка, напечатанные два раза

  2. почему значение дочернего идентификатора отличается, когда я вызвал только один раз

  3. почему значение идентификатора второго родительского идентификатора равно значению первого идентификатора дочернего элемента

что на самом деле Id родителя и Чили спасибо большое

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Функция fork вызывается один раз, а возвращает дважды .Таким образом, и ребенок, и родитель выполняют printf s.

printf("child id :%d\n" , pid); /* Both child and parent print this. */
printf("parent id :%d\n" , getppid()); /* Both child and parent print this. */

Тот факт, что вы говорите «ребенок» и «родитель», на самом деле ничего не меняет, поэтому вы получаете ошибочные результаты.

Обычным шаблоном является проверка значения, возвращаемого fork.Возвращается 0 у ребенка и PID ребенка у родителя.

pid_t pid = fork();
if (pid)
    printf("I am the parent, pid: %d. The child has pid: %d\n", getpid(), pid);
else
    printf("I am the child, pid: %d\n", getpid());

/* Common code. */
for...
2 голосов
/ 13 октября 2011

ниже приведены ответы на ваши вопросы:

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

Надеюсь, вы сможете его понять.

0 голосов
/ 13 октября 2011

После вызова вилки родитель и потомок выполняют один и тот же код

вот почему печатается 4 идентификатора

31131 - ваш дочерний процесс

31130 его родитель

31052 является родителем родителя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...