2013-04-18 48 views
7

Tôi đã chạy chương trìnhTại sao getppid() từ sự trở lại con 1

#include<stdio.h> 
#include <unistd.h> 
main() 
{ 
    pid_t pid, ppid; 
    printf("Hello World1\n"); 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("I am the child\n"); 
     printf("The PID of child is %d\n",getpid()); 
     printf("The PID of parent of child is %d\n",getppid()); 
    } 
    else 
    { 
     printf("I am the parent\n"); 
     printf("The PID of parent is %d\n",getpid()); 
     printf("The PID of parent of parent is %d\n",getppid());   
    } 
} 

đầu ra tôi nhận được.

$ ./a.out 
Hello World1 
I am the parent 
The PID of parent is 3071 
The PID of parent of parent is 2456 
I am the child 
The PID of child is 3072 
The PID of parent of child is 1 

tôi couldnt hiểu dòng

Các PID của cha mẹ của đứa trẻ là 1

Nó cần phải có được 3071?

+0

Bạn sẽ quan sát hành vi bạn mong đợi bằng cách thêm các lệnh thích hợp 'fflush (NULL);' (trước lệnh 'fork') và' sleep (1); '(trong cả hai phần còn lại của' if' và ngay trước khi kết thúc 'main'). –

Trả lời

12

Vì quá trình cha mẹ kết thúc vào thời điểm trẻ yêu cầu pid của cha mẹ.

Khi một quá trình kết thúc, tất cả các con của nó được bố trí như những đứa trẻ của quá trình init, mà pid là 1.

Hãy thử sử dụng wait() trong mã của phụ huynh để chờ đợi cho đứa trẻ để thực thi. Sau đó nó sẽ hoạt động như bạn mong đợi.

0

pid 1 là cho quá trình init và có vẻ như quá trình cha mẹ đã hoàn tất trước khi trẻ có thể in.

Nếu bạn chỉnh sửa một phần khác như thế này: -

else 
    { 
     printf("I am the parent\n"); 
     printf("The PID of parent is %d\n",getpid()); 
     printf("The PID of parent of parent is %d\n",getppid()); 
     while(1); 
    } 

Bạn sẽ thấy kết quả ngay.

Các vấn đề liên quan