2014-12-17 7 views
1

Я пытаюсь написать программу на C, где у меня есть один родитель, создающий два дочерних элемента.Получение идентификатора дочернего процесса от родителя с помощью C

Моя задача - получить идентификатор процесса родителя и обоих дочерних элементов. Для этого я использовал getpid().

Теперь меня попросили получить дочернюю информацию от родителя. Я не понимаю, как это сделать. Как я могу получить идентификатор обработки для ребенка из родителя?

я это на данный момент (упрощенный)

fork1 = fork(); 

if (fork1 < 0) 
    fork error 
else if (fork1 == 0) { 
    child 1 
    use getpid() 
    use getppid() 
} else { 
    fork2 = fork(); 

    if (fork2 < 0) 
     fork error 
    else if (fork2 == 0) { 
     child 2 
     use getpid() 
     use getppid() 
    } else 
     parent again 
} 
+2

Разве fork() не возвращает PID дочернего процесса при вызове в родительском процессе? Ссылка на Wiki: http://en.wikipedia.org/wiki/Fork_%28system_call%29#Example_in_C –

+1

Это дублированный вопрос! Проверьте [this] (http://stackoverflow.com/questions/9147760/how-to-get-child-pid-in-c) другой вопрос StackOverflow. –

ответ

1

Через минуту прибегая к помощи я нашел this страницу, где все, что вам нужно, это написано:

Система вызова вилка() используется для создания процессов. Он не принимает аргументов и возвращает идентификатор процесса.

Я выделил деталь, которая является импортом и для вас, поэтому вам не нужно ничего делать, чтобы получить идентификаторы процессов для детей. У вас их уже есть в fork1 и fork2!

Вот код, который будет печатать идентификаторы PID от родителей и детей.

#include <stdio.h> 

int main() { 
    int fork1 = fork(); 
    if (fork1 < 0) { 
    printf("error\n"); 
    } else if (fork1 == 0) { 
    printf("I'm child 1\n"); 
    printf("child 1: parent: %i\n", getppid()); 
    printf("child 1: my pid: %i\n", getpid()); 
    } else { 
    int fork2 = fork(); 
    if (fork2 < 0) { 
     printf("error\n"); 
    } else if (fork2 == 0) { 
     printf("I'm child 2\n"); 
     printf("child 2: parent: %i\n", getppid()); 
     printf("child 2: my pid: %i\n", getpid()); 
    } else { 
     printf("I'm the parent\n"); 
     printf("The PIDs are:\n"); 
     printf("parent: %i\n", getpid()); 
     printf("child 1: %i\n", fork1); 
     printf("child 2: %i\n", fork2); 
    } 
    } 
    return 0; 
} 
0

вилка() возвращает два различных значения, она возвращает ноль для ребенка и возвращает ненулевое положительное значение для родителя, это значение является дочерним процессом ID, так в последнем еще, fork1 является Идентификатор child1 и fork2 - pid child2.