2012-02-05 40 views
9

Đó là mã của tôi.Làm thế nào để fork() n con xử lý một cách chính xác trong C?

#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) 
{ 
    int i, pid; 

for(i = 0; i < atoi(argv[1]); i++) { 
    pid = fork(); 
    if(pid < 0) { 
     printf("Error"); 
     exit(1); 
    } else if (pid == 0) { 
     printf("Child (%d): %d\n", i + 1, getpid()); 
     exit(0); 
    } else { 
     wait(NULL); 
    } 
} 

} 

Kết quả là như vậy.

Child (1): 5676 
Child (2): 4624 
Child (3): 4800 
Child (4): 5596 
Child (5): 5580 

Tuy nhiên đó không phải là đầu ra mong đợi trong bài tập ở nhà của tôi. Nó sẽ là như thế. Có gì sai với mã? Ai đó có thể giúp tôi?

Child (2): 4625 
Child (1): 4624 
Child (3): 4626 
Child (4): 4627 
Child (5): 4628 

Cảm ơn sự giúp đỡ của bạn. Bây giờ tôi sẽ thử nó.

P.S. Xin lỗi tiếng Anh của tôi là xấu. Tôi hy vọng bạn có thể hiểu những gì tôi đã nói.

Trả lời

3

Mã của bạn hoạt động hoàn hảo trên máy tính của tôi. Nó có thể phụ thuộc vào os.

tuy nhiên bạn nên kiểm tra xem argc có bằng 1 không để tránh lỗi phân đoạn nếu không có đối số nào được cung cấp cho chương trình của bạn.

+0

Cảm ơn bạn đã đề xuất. –

+0

Vâng, nó thực sự là phụ thuộc os. Tôi đã kiểm tra chương trình của mình trong máy chủ Linux của trường. Tôi nhận được kết quả mong đợi. Cảm ơn nhiều. –

1

Hệ thống có các PID miễn phí để gán cho các quy trình. Bạn có thể ngã ba quá trình ID 4000 và có một con ID 3900. Bạn bài tập về nhà không nên đặt số vì ID quá trình đầu tiên không bao giờ giống nhau.

+0

Cảm ơn bạn. Tôi đã cung cấp một số mô tả về chương trình có trong bài tập về nhà của tôi. Hãy giúp tôi. –

1

Lý do tại sao bạn nhận được đầu ra không theo thứ tự là bạn không thể dự đoán chính xác con nào sẽ hoạt động khi nào. Vì vậy, nó có thể xảy ra rằng việc thực hiện đứa con thứ nhất của bạn bị trì hoãn cho đến khi lần thứ hai của bạn là fork() được chỉnh sửa và bắt đầu.

Con bạn thường nhận được PID tuần tự, mặc dù đây là hệ điều hành phụ thuộc.

Cả hai vấn đề không phải là vấn đề với nhiệm vụ được lên lịch của bạn - không phải các PID tuyệt đối thực sự quan trọng (như đã nói, mọi hệ điều hành có thể thực hiện công cụ của riêng nó, chỉ định PID một cách tuần tự hoặc ngẫu nhiên). childs làm công cụ của họ: mỗi phần của các child có thể có thời gian thực hiện khác nhau, dẫn đến đầu ra không có thứ tự. Điều này được tính miễn là dữ liệu được truyền chính xác - đó là trường hợp nếu cha mẹ tạo chuỗi và sau đó dồn. Trong trường hợp này, bố cục bộ nhớ của tiến trình con cũng giống như bố cục của cha mẹ tại thời điểm ngã ba. Vì vậy, cha mẹ có thể sửa đổi "mảng truyền dữ liệu" của nó mà không ảnh hưởng đến các con đang chạy.

Để giảm sự nhầm lẫn, bạn có thể loại bỏ việc xuất các PID trong mỗi dòng. Có lẽ chúng có thể được xuất ở đầu của quá trình con tương ứng, nhưng sau đó, nó sẽ là đủ để nói ví dụ Child 3: straight length 6 <S6,H5,C4,S3,H2,SA> mà không lặp lại PID.

+0

Cảm ơn bạn. Tôi đã cung cấp một số mô tả về chương trình có trong bài tập về nhà của tôi. Hãy giúp tôi. –

+1

Không chỉ là phân công phụ thuộc vào hệ điều hành, việc lập lịch trình của các tiến trình con phụ thuộc vào thời gian chạy; không có gì đảm bảo rằng đứa trẻ đầu tiên được chia nhỏ là đứa trẻ đầu tiên được lên kế hoạch để chạy. – tbert

+0

@tbert Exactl đó là những gì tôi muốn nói với phần "đầu tiên" của câu trả lời của tôi, một trong những đề cập đến các công cụ dự báo. – glglgl

1

Với đầu ra được mong đợi đó, rất có thể bài tập về nhà của bạn trước hết nên loại bỏ tất cả các quy trình và sau đó gọi chờ.

Chỉ cần bỏ qua cuộc gọi chờ trong vòng lặp và thực hiện một cuộc gọi riêng biệt bên dưới cho đến khi wait trả về -1errno đặt thành ECHILD. Lưu ý rằng thứ tự đầu ra của trẻ em sẽ là ngẫu nhiên, hoặc ít nhất là không hoàn toàn theo thứ tự, vì vậy không nhất thiết là 2 1 3 4 5.

Đây chỉ là một phỏng đoán, bạn nên cung cấp thêm thông tin nếu bạn muốn nhiều hơn câu trả lời cụ thể.

+0

Cảm ơn bạn. Tôi đã cung cấp một số mô tả về chương trình có trong bài tập về nhà của tôi. Hãy giúp tôi. –

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