2012-05-03 3 views
6

Я пытаюсь сделать домашнее задание, где мне нужно использовать fork(), но я не знаю, почему я не могу остановить свои вилки после запуска их через цикл for:fork() loop 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; 
} 

Выход:

[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

Вы разворачиваете два раза в одном цикле, знаете ли вы это? –

+0

Noop, как получилось, были ли это ...? : < –

+4

вы создали вилку. Вы должны сделать что-то вроде: pid = fork(); если (pid <0) ...; if (pid == 0) .... – kofemann

ответ

15

Даниэль Фишер заставил меня дать ответ.

Изменение:

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

To:

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

Или использовать переключатель заявление:

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

Спасибо! оценил, и вы дали им хорошую идею с коммутатором: D –

+4

«принудительный» - довольно сильное слово;) –

0

Вы можете использовать execl() или какой-либо другой вариант EXEC, это обеспечивает что созданный ребенок не наследует ничего от родителя. Это позволит вам создавать детей с циклом for без перехода в экспоненциальный взрыв ребенка. Измените аргументы функции execl соответствующим образом, и вы можете создать 3 процесса, например:

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

    sleep(2); 
}