2009-05-18 36 views
13

ai đó có thể giúp tôi về cách tạo nhiều quy trình con có cùng cha mẹ để làm "một phần" một phần công việc cụ thể?Nhiều quá trình con

ví dụ: thuật toán sắp xếp bên ngoài được áp dụng với quy trình con; mỗi tiến trình con sắp xếp một phần của dữ liệu và cuối cùng là cha mẹ kết hợp chúng ..

EDIT: Có lẽ tôi nên đề cập đến các forking nhiều tiến trình con với vòng lặp ..

+0

bạn sẽ không thể kết thúc tốt hơn với chủ đề? – AviD

+0

tốt, có thể đúng .. nhưng tôi cần phải thực hành nhiều forking() có nghĩa là nhiều quá trình con .. – israkir

Trả lời

3

Bạn có thể làm điều này với fork. Một phụ huynh cho trước có thể nĩa như có thể lần như nó muốn. Tuy nhiên, tôi đồng ý với AviD pthreads có thể phù hợp hơn.

pid_t firstChild, secondChild; 
firstChild = fork(); 
if(firstChild > 0) 
{ 
    // In parent 
    secondChild = fork(); 
    if(secondChild > 0) 
    { 
    // In parent 
    } 
    else if(secondChild < 0) 
    { 
    // Error 
    } 
    else 
    { 
    // In secondChild 
    } 
} 
else if(firstChild < 0) 
{ 
    // Error 
} 
else 
{ 
    // In firstChild 
} 
+0

chúng ta cũng không nên xem xét trường hợp, nơi xxxChild <0 sẽ tăng một lỗi? Tôi nghĩ (xxxChild> 0) sẽ phù hợp hơn ... – CHANist

+0

@CHANist, cảm ơn, nên được đề cập đến ngay bây giờ. –

38

Dưới đây là làm thế nào để ngã ba 10 trẻ em và chờ đợi cho họ để kết thúc:

pid_t pids[10]; 
int i; 
int n = 10; 

/* Start children. */ 
for (i = 0; i < n; ++i) { 
    if ((pids[i] = fork()) < 0) { 
    perror("fork"); 
    abort(); 
    } else if (pids[i] == 0) { 
    DoWorkInChild(); 
    exit(0); 
    } 
} 

/* Wait for children to exit. */ 
int status; 
pid_t pid; 
while (n > 0) { 
    pid = wait(&status); 
    printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status); 
    --n; // TODO(pts): Remove pid from the pids array. 
} 
+1

tôi đã không thực sự nhận được phần thứ hai (chờ đợi cho trẻ em để thoát) .. tình trạng có nghĩa là gì? đó là một tài sản quy trình con? – israkir

+0

Trạng thái là trạng thái thoát của quá trình con. Nó phụ thuộc vào giá trị exit (...), hoặc nếu quá trình bị giết bởi tín hiệu, thì nó phụ thuộc vào số hiệu. Xem phần này để biết thêm: http://linux.die.net/man/2/wait – pts

+0

một câu hỏi, bạn có phải là người mẹ từ cùng một gốc hoặc từ mỗi đứa trẻ không? –

5

Tôi nghĩ rằng nó sẽ là giá trị chỉ ra lý do tại sao chủ đề thích hợp hơn ở đây:

Như bạn cố gắng để làm một "phần" của công việc song song tôi giả định rằng chương trình của bạn cần phải biết về kết quả của việc tính toán. fork() s của một quá trình không chia sẻ nhiều hơn sau đó thông tin ban đầu sau ngã ba(). Mọi thay đổi trong một quy trình đều không biết tên kia và bạn sẽ cần phải chuyển thông tin dưới dạng tin nhắn (ví dụ: thông qua một đường ống, xem "đường ống"). Các chủ đề trong quy trình chia sẻ cùng một không gian địa chỉ và cho phép có thể thao tác dữ liệu và cho phép chúng hiển thị các mục khác "ngay lập tức". Ngoài ra thêm các lợi ích của trọng lượng nhẹ hơn, tôi sẽ đi với pthreads().

Sau khi tất cả: Bạn sẽ tìm hiểu tất cả những gì bạn cần biết về fork() nếu bạn sử dụng pthreads anyway.

+0

Mặt khác, nếu bạn * làm việc * là người dùng được cung cấp, bạn sẽ muốn làm điều đó trong một quy trình mới để bảo vệ sự cố. –

1

Nếu bạn muốn khởi chạy một số nhánh, bạn nên thực hiện theo cách đệ quy. Điều này là bởi vì bạn phải gọi ngã ba từ quá trình cha mẹ. Nếu không, nếu bạn khởi chạy một ngã ba thứ hai, bạn sẽ lặp lại cả quá trình cha và con đầu tiên. Dưới đây là ví dụ:

void forker(int nprocesses) 
{ 
    pid_t pid; 

    if(nprocesses > 0) 
    { 
     if ((pid = fork()) < 0) 
     { 
      perror("fork"); 
     } 
     else if (pid == 0) 
     { 
      //Child stuff here 
      printf("Child %d end\n", nprocesses); 
     } 
     else if(pid > 0) 
     { 
      //parent 
      forker(nprocesses - 1); 
     } 
    } 
} 
Các vấn đề liên quan