2013-03-03 70 views
15

Khi tôi chạy vào mã bên dướigetpid và getppid trở lại hai giá trị khác nhau

#include <stdio.h> 
#include <sys/types.h> 
//int i=0; 
int main(){ 

int id ; 
id = fork() ; 
printf("id value : %d\n",id); 
    if (id == 0) 
    { 
    printf ("Child : Hello I am the child process\n"); 
    printf ("Child : Child’s PID: %d\n", getpid()); 
    printf ("Child : Parent’s PID: %d\n", getppid()); 
    } 
    else 
    { 
    printf ("Parent : Hello I am the parent process\n") ; 
    printf ("Parent : Parent’s PID: %d\n", getpid()); 
    printf ("Parent : Child’s PID: %d\n", id); 
    } 

} 

đầu ra của tôi là

id value : 20173 
Parent : Hello I am the parent process 
Parent : Parent’s PID: 20172 
Parent : Child’s PID: 20173 
id value : 0 
Child : Hello I am the child process 
Child : Child’s PID: 20173 
Child : Parent’s PID: 1 

Làm thế nào có thể PID của cha mẹ (20.172) khác với ID của cha mẹ của đứa trẻ (1) ? Hai người đó có bình đẳng không?

Trả lời

24

Điều đang xảy ra là cha mẹ sẽ chấm dứt trước khi trẻ chạy. điều này khiến đứa trẻ trở thành một đứa trẻ mồ côi và nó được chấp nhận bởi quá trình gốc với PID của 1. Nếu bạn đặt trễ hoặc đọc dữ liệu từ stdin thay vì để cho cha mẹ chấm dứt, bạn sẽ thấy kết quả bạn mong đợi.

Quy trình ID 1 thường là quá trình init chủ yếu chịu trách nhiệm khởi động và tắt hệ thống. Init (viết tắt của khởi tạo) là một quá trình daemon là tổ tiên trực tiếp hoặc gián tiếp của tất cả các quy trình khác. wiki link for init

Như user314104 chỉ ra sự chờ đợi() và waitpid() chức năng được thiết kế để cho phép một quá trình cha mẹ đình chỉ bản thân cho đến khi tình trạng của một quá trình con thay đổi. Vì vậy, một cuộc gọi để chờ() trong nhánh cha của câu lệnh if của bạn sẽ khiến cho phụ huynh phải chờ đứa trẻ chấm dứt.

+1

Hoặc, thông thường hơn, wait() và waitpid(). – user314104

+1

@Jackson đã thêm thông tin khác với liên kết. Tôi cảm thấy nó cần phải hoàn thành câu trả lời tốt của bạn. nếu bạn không thích quay trở lại. –

0

Vì quá trình cha mẹ hết và phát hành, quá trình con của nó đã trở thành một đứa trẻ mồ côi, init (viết tắt của khởi tạo) mà pid là 1 nhận được quá trình mồ côi.