2016-02-08 3 views
-1

я следующий кодПонимание вилка() в Linux

void main() 
{ 

pid_t pid,pid1; 

pid = fork(); 

if(pid==0) 
{ 
    pid1= getpid(); 

    printf("\n Child A %d" ,pid); 
    printf("\n Child B %d",pid1); 
} 
else 
{ 

    pid1 = getpid(); 
    printf("\n Parent C %d:",pid); 
    printf("\nParent d %d:",pid1); 

} 
} 

я не понимая, почему я получаю тот же идентификатор процесса B и C. Может кто-нибудь помочь мне здесь?

+0

не ваши заявления печати немного перепутали? Если 'fork' возвращает' 0', то вы находитесь в дочернем процессе, поэтому печать 'pid' даст' 0', а печать 'pid1' (в результате вызова' getpid' внутри дочернего элемента) будет pid ребенок. Если вы находитесь в родительском, то 'pid' является pid процесса * child *, а' pid1' (в результате вызова 'getpid' внутри родителя) является pid родительского элемента. – lurker

ответ

0
pid1 = getpid(); 

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

pid = fork(); 

Это инициируется родительским процессом, но возвращаемое значение доступно как родительскому, так и дочернему. Однако он возвращает другое значение родительскому и дочернему процессам. Прямо из fork man page:

ПИД дочернего процесса возвращается в родителе и 0 возвращается в дочернем

Таким образом, в обоих случаях (В и С), это pid дочернего процесса.

0

Этот код управляется двумя процессами, один из которых является родителем, а другой - дочерними. р процесс - возвращает идентификатор процесса с и С процесса возвращения 0. Я думаю, ваша программа может быть демонстрационную вилка(), так что это может быть так:

void main() 
{ 

pid_t pid,pid1; 

pid = fork(); 

if(pid==0) 
{ 
pid1= getpid(); 

printf("\n i am Child A %d" ,pid1); 
printf("\n Parent A %d",getppid()); 
} 
else 
{ 

pid1 = getpid(); 
printf("\n i am Parent B %d:",pid1); 
printf("\n Children B %d:",pid); 


} 
} 
Смежные вопросы