2012-05-03 37 views
6

Tôi đang cố gắng thực hiện bài tập về nhà mà tôi phải sử dụng fork() nhưng tôi không biết tại sao tôi không thể dừng dĩa sau khi chạy chúng qua vòng lặp của tôi:fork() in for() loop

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(int argc, char *argv[]){ 
    int limit = argc/2; 
    if(argc%2 == 0){ 

      perror("the number of arguments given must pe even!"); 
      exit(1); 
    } 

    int i; 
    for(i=0; i<=limit; i++){ 
     if(fork()==-1){ 
      perror("childes couldn't be created\n"); 
      exit(1); 
     } 
     if(fork()==0){ 
      printf("fork: %d \n",i); 
      exit(1); 
     } 
     wait(0); 
    } 


    printf("exiting...\n"); 
    return 0; 
} 

Output:

[email protected]:~/OS/UprocH$ ./exe a b c d 
fork: 0 
fork: 0 
fork: 1 
fork: 1 
fork: 1 
fork: 2 
fork: 2 
fork: 1 
fork: 2 
exiting... 
exiting... 
fork: 2 
exiting... 
exiting... 
fork: 2 
exiting... 
exiting... 
exiting... 
[email protected]:~/OS/UprocH$ fork: 2 
fork: 2 
fork: 2 
exiting... 
+4

Bạn đang tìm kiếm hai lần trong cùng một vòng lặp, bạn có biết điều đó không? –

+0

Noop làm thế nào đến, là ...? : < –

+4

bạn đã tạo ra một quả bom ngã ba. Bạn nên làm một cái gì đó như: pid = fork(); if (pid <0) ...; if (pid == 0) .... – kofemann

Trả lời

15

Daniel Fischer buộc tôi phải cung cấp một câu trả lời.

Thay đổi:

if(fork()==-1){} // first fork 
if(fork()==0){} // second fork 

Để:

pid = fork(); 
if(pid == -1) 
{ 
    ... //failed 
} 
else if(pid == 0) 
{ 
    ... //success 
} 

Hoặc sử dụng một câu lệnh switch:

switch(fork()) 
{ 
    case -1: 
     ... // failed 
     break; 
    case 0: 
     ... // success 
     break; 
} 
+2

Cảm ơn bạn! đánh giá cao, và bạn gaved em một ý tưởng tốt với chuyển đổi: D –

+4

"buộc" là một từ khá mạnh;) –

0

Bạn có thể sử dụng execl() hoặc một số biến thể khác của exec, đảm bảo này rằng đứa trẻ được tạo ra không thừa hưởng bất cứ điều gì từ cha mẹ. Điều này sẽ cho phép bạn tạo ra trẻ em với một vòng lặp for mà không đi vào một vụ nổ con theo cấp số nhân. Sửa đổi các đối số của hàm execl phù hợp và bạn có thể tạo 3 quy trình như sau:

main() 
{ 
    int i,pid[3]; 
    for(i=0;i<3;i++) 
    { 
     pid[i]=fork(); 
     if (pid[i]==0) 
      execl("path",0,0); 
    } 

    sleep(2); 
} 
Các vấn đề liên quan