2012-11-28 26 views
5
int x=0; 
int main() 
{ 
    for(i=0;i<2;i++) 
    { 
    fork(); 
    x=x+5; 
    } 
    return 0; 
} 

diagramLàm thế nào để giải quyết ví dụ fork() này trong c

Tôi là một newbie đến khái niệm fork(). Là cây trên (với giá trị x) là giải pháp đúng cho mã C được đề cập ở trên? Các giá trị trong các nút lần lượt là các giá trị x của các quy trình của chúng.

Và chúng tôi cũng có thể trả về giá trị cho quy trình gốc từ quy trình con không? Giả sử trong đoạn mã ví dụ trên tôi có thể trả lại giá trị x của đứa trẻ cho quá trình cha mẹ không?

+1

Đó thậm chí sẽ không biên dịch. – geoffspear

+1

Nó không hoàn toàn rõ ràng đồ thị của bạn có nghĩa là gì, nhưng giả sử (hướng) cạnh đại diện cho mối quan hệ quá trình cha-con và gốc là quá trình gốc, sau đó 5 phải là 10 vì mỗi trong số 4 tiến trình kết thúc tăng x bằng 5 hai lần . Dù sao, chính xác thì bạn đang cố gắng làm gì? – Celada

+0

có. Gốc trong sơ đồ thể hiện quy trình gốc ban đầu và các cạnh được chỉ thị cho thấy mối quan hệ cha-con. Tất cả tôi muốn biết là Tổng số có bao nhiêu nút và liệu giá trị x trong các nút tương ứng có đúng hay không không cảm ơn. – starkk92

Trả lời

6

Bạn có nghĩa là đó là một cây quá trình và trong các bong bóng là giá trị của x? Thế thì không, không đúng.

Khi trẻ được sinh ra, nó sẽ có một bản sao chính xác của phụ huynh ...vì vậy hãy "in" một số giá trị vì vậy chúng tôi có thể thấy trạng thái của sự vật (Tôi makeing lên PID cho tất cả mọi thứ)

Khi chúng tôi bắt đầu, nó chỉ là phụ huynh:

parent (11174) x = 0, i = 0 

Sau đó, chúng tôi nhấn fork() , bây giờ chúng tôi có hai quá trình:

+--parent (11174) x = 0, i = 0 
| 
+->child1 (11175) x = 0, i = 0 

Tiếp toán:

parent (11174) x = 5, i = 0 

child1 (11175) x = 5, i = 0 

Wh en vòng lặp chúng tôi trở lại, tôi của chúng tôi sẽ được tăng lên, và mỗi quá trình bây giờ chạy vòng lặp và truy cập fork():

+--parent (11174) x = 5, i = 1 
| 
+->child2 (11176) x = 5, i = 1 

+--child1 (11175) x = 5, i = 1 
| 
+->child (11177) x = 5, i = 1 

Bây giờ tất cả mọi người chạm toán một lần nữa:

parent (11174) x = 10, i = 1 

child2 (11176) x = 10, i = 1 

child1 (11175) x = 10, i = 1 

child (11177) x = 10, i = 1 

Cuối cùng tất cả mọi người chạm vòng lặp và gia số i vi phạm. Vì vậy, kết quả cuối cùng của bạn là:

parent (10)----->child1(10)---->child(10) 
      | 
      +----->child2(10) 
+0

giải thích tuyệt vời.Làm thế nào tôi hiểu rõ ràng làm thế nào để giải quyết những vấn đề kinda.Thanks :) – starkk92

+1

@ user1632141 - vui lòng giúp đỡ! Thật hữu ích khi ghi lại các bước để bạn có thể thấy nó hoạt động, nếu bạn không thể làm điều đó trong đầu, sau đó biên dịch mã mẫu nhỏ của bạn và thêm một số printfs, giống như: 'printf (" process% d: x =% d , i =% d \ n ", getpid(), x, i);' sẽ là một nơi tốt để bắt đầu! – Mike

+0

đã nhận nó.thanks .. – starkk92

6

Nếu bạn gọi fork() thì mã bên dưới là cho cả hai quy trình, nghĩa là parentchild.

fork tạo quy trình mới (được gọi là con) có không gian địa chỉ khác với quy trình gốc. Vì vậy, không có gì được chia sẻ giữa chúng.

Bạn đang gọi đến ngã ba trong vòng lặp, Trên thực tế 2 lần, Vì vậy, sẽ có tổng cộng 4 quy trình độc lập.

Nếu bạn muốn làm mã hóa riêng biệt trong quá trình đứa trẻ luôn luôn sử dụng giá trị trả về của fork() như thế này:

if(!fork()) 
{ 
// child process 
} 
else 
{ 
// parent process 
} 

Đối với câu hỏi này:

And also can we return values to the parent process from the child process? 
    Suppose lets say in the above example code can I return the x value of the 
    child to the parent process? 

Câu trả lời là, Bạn có thể không trả lại trực tiếp một giá trị từ quy trình này sang tiến trình khác. Giao tiếp giữa 2 hoặc nhiều quy trình đạt được bằng cách sử dụng khái niệm gọi là Quá trình liên lạc commmunicaton (IPC) mà bạn có thể thực hiện theo 2 cách.

1. shared memory 
2. memssage passing (pipe, rpc) 

Cũng có rất nhiều điều bạn sẽ phải hiểu trước khi giải quyết vấn đề này. Đặc biệt khi bạn đang cố gắng để làm điều đó bằng fork và cũng muốn trở về giá trị

Bạn sẽ thấy this

Hoặc, điều này có thể giúp bạn more

+0

yes.it help.thanks :) – starkk92

+1

Bất cứ lúc nào, nhưng hãy nhớ giải quyết vấn đề này sẽ không giúp bạn nhiều, cố gắng để có được khái niệm đằng sau ngã ba hoặc bất kỳ quá trình sáng tạo và giao tiếp – Omkant

+0

Đúng. bây giờ với tôi .. – starkk92

2
fork(); 

tạo ra một quá trình con và cho phép sao chép tất cả các biến của công ty mẹ với các biến đứa trẻ.

phụ huynh:

chương trình chính bạn tạo ra 2 trẻ em như bạn nêu tại Ví-Loop, khi nó tạo ra child1, giá trị là i0 khi nó tạo ra child2, giá trị là i1

Child1:

Child1 bắt đầu thực hiện nó sau khi fork(), i++ thực hiện, trong phiên bản kế tiếp (i = 1) - điều kiện đúng (1 < 2), Child1 chia hai đứa trẻ khác đó là child3, trong child3 giá trị của i1.

Child2 và Child3:

Child2Child3 bắt đầu thực hiện nó với i = 1 sau fork(), i++ thực hiện, bây giờ trở thành i2, tình trạng sai sự thật, không có con tiếp tục được tạo ra.

3 quy trình được tạo trong Tổng số.

Mã sản phẩm:

int x=0; 
int main() 
{ 
    for(i=0;i<2;i++) 
    { 
    fork(); 
    x=x+5; 
    } 
    printf("x = %d\n", x); 
return 0; 
} 

OUTPUT:

x = 10 
x = 10 
x = 10 
x = 10 
Các vấn đề liên quan