2012-02-19 27 views
6

Xét đoạn code dưới đây:giá trị trả về trong vfork) hệ thống (gọi

int main() 
{ 
    int pid; 
    pid=vfork(); 
    if(pid==0) 
    printf("child\n"); 
    else 
    printf("parent\n"); 
    return 0; 
    } 

Trong trường hợp vfork() không gian địa chỉ được sử dụng bởi quá trình cha mẹ và quá trình con là cùng, sao chép để duy nhất của biến pid nên ở đó. Bây giờ tôi không thể hiểu làm thế nào biến pid này có thể có hai giá trị được trả về bởi vfork() tức là không cho con và không cho cha mẹ?

Trong trường hợp fork() không gian địa chỉ cũng được sao chép và có hai bản sao của biến pid trong mỗi đứa trẻ và cha mẹ, vì vậy tôi có thể hiểu được trong trường hợp này hai bản khác nhau có thể có giá trị khác nhau được trả về bởi ngã ba() nhưng không thể hiểu trong trường hợp vfork() cách pid có hai giá trị được trả về bởi vfork()?

+2

Đó là nguy hiểm - bạn có thể 'exec()' hoặc '_exit()' trong ['vfork()'] (http://pubs.opengroup.org/onlinepubs/009695399/toc.htm) 'd con , nhưng đó chỉ là về nó. Khá nhiều thứ khác dẫn đến hành vi không xác định. Khuyến nghị: không sử dụng ['vfork()'] (http://pubs.opengroup.org/onlinepubs/007908799/xsh/vfork.html); thực sự, tôi thậm chí sẽ không bận tâm để học cách sử dụng nó một cách an toàn. Nó giống như 'gets()', một hàm mà tốt nhất là giả vờ không tồn tại. –

+1

@JonathanLeffler: 'vfork()' khá hữu ích cho các hệ thống MMU-less. – ninjalj

+0

Vâng, tôi đồng ý với u chúng tôi không nên sử dụng nó, nhưng tôi đã sử dụng vfork để giải quyết một vấn đề về tạo cây quá trình và giao tiếp giữa các quy trình của các cấp độ khác nhau của cây, trong trường hợp đó vfork rất hữu ích. Tôi sẽ giữ lời khuyên của bạn. –

Trả lời

6

Không có 2 bản sao. Khi bạn cal vfork cha mẹ đóng băng trong khi đứa trẻ làm điều của nó (cho đến khi nó gọi _exit(2) hoặc execve(2)). Vì vậy, tại bất kỳ thời điểm nào, chỉ có một biến đơn pid.

Lưu ý phụ, những gì bạn đang làm là không an toàn. The standard thích rõ ràng nó rõ ràng:

Các vfork() chức năng sẽ tương đương với fork(), ngoại trừ rằng hành vi là undefined nếu quá trình tạo ra bởi vfork() hoặc đổi bất kỳ dữ liệu khác hơn là một biến loại pid_t được sử dụng để lưu trữ giá trị trả lại từ vfork() hoặc trả về từ hàm mà trong đó vfork() được gọi hoặc gọi bất kỳ chức năng nào khác trước khi thành công gọi _exit() hoặc một trong các nhóm exec chức năng.

Như một mặt lưu ý thứ hai, vfork đã bị xóa khỏi SUSv4 - có thực sự không có điểm trong việc sử dụng nó.

+0

Nó có nghĩa là trong khi usfng vfork quá trình tạo có thể sửa đổi giá trị của ** pid_t ** loại biến vì vậy khi con thoát và cha mẹ tiếp tục như thế nào hoặc bởi ai giá trị trước đó của ** pid_t ** biến được khôi phục ?? ? –

+2

@ L.ppt Khi cha mẹ tiếp tục 'pid_t' sẽ lưu trữ PID của đứa trẻ. – cnicutar

+2

@ L.ppt: trình biên dịch xử lý đặc biệt biến 'pid_t' được trả về từ' vfork() '. Nó luôn luôn trên một đăng ký, và không tràn vào bộ nhớ. – ninjalj