2010-03-09 2 views
6
void main() 
{ 
    if (fork()) 
    { 
     printf ("PID1 %d\n", getpid()); 
    } 
    else 
    { 
     printf ("PID2 %d\n", getpid()); 
    } 
} 

Что делает этот код? Я знаю, что это имеет какое-то отношение к идентификаторам процессов, но не должно вилка возвращать что-то в условие, чтобы определить, является ли это дочерним/родительским процессом?c - fork() код

+5

Нужна «домашняя работа»? –

ответ

16

Вообще это:

pid_t pid = fork(); 
if(pid == 0) { 
    //child 
} else if(pid > 0) { 
    //parent 
} else { 
//error 
} 

Страница человек говорит:

RETURN VALUE 
    Upon successful completion, fork() shall return 0 to the child 
    process and shall return the process ID of the child process to the 
    parent process. Both processes shall continue to execute from 
    the fork() function. 
    Otherwise, -1 shall be returned to the parent process, no child process 
    shall be created, and errno shall be set to indicate the error. 
+0

Ahh ok спасибо. Редактировать: Да, я тоже вижу много примеров, поэтому я смутился. – tm1

+0

если (fork()) // если fork успешный ...................... printf ("PID1% d \ n", getpid()); // print parentID ...................... else printf ("PID2% d \ n", getpid()); // print child id – tm1

+0

Правильно ли это? Извините, не знаю тегов кода. – tm1

-2

Возвращаемое значение вилке() указывает на процесс, является ли родитель или ребенок. Таким образом, ребенок всегда будет печатать «PID2 0», потому что если fork() возвращает 0, выполняется вторая часть оператора if.

+1

не 'getpid()' возвращает фактический PID текущего процесса независимо от того, что 'fork()' возвращает? –

+0

@SF: звучит прямо для меня. –

3

Приведенный выше код создает новый процесс, когда он выполняет вызов fork, этот процесс будет почти точной копией исходного процесса. Оба процесса будут продолжать выполнять sepotratly в форме возврата, вызов вилки, который вызывает вопрос «Как узнать, если im новый процесс или старый?» так как они почти идентичны. Для этого разработчики fork заставили вызов fork возвращать разные вещи в каждом процессе, в новом процессе (дочернем) вызов fork возвращает 0, а исходный процесс (родительский) fork возвращает идентификатор нового процесса, чтобы родитель мог взаимодействовать с ним.

Так что в коде вызов fork создает дочерний процесс, оба процесса выполняют оператор if seporatly. В родительском объекте возвращаемое значение не равно нулю, поэтому родительский оператор выполняет оператор if. В дочернем случае возвращаемое значение равно 0, поэтому он выполняет оператор else. Надеюсь, что это поможет :-)