我正在努力完成一项家庭作业,我必须使用fork()
,但我不知道为什么在通过我的for循环运行它们之后我无法阻止我的叉子:
#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;
}
输出:
warzaru@ubuntu:~/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...
warzaru@ubuntu:~/OS/UprocH$ fork: 2
fork: 2
fork: 2
exiting...
答案 0 :(得分:15)
Daniel Fischer强迫我提供答案。
变化:
if(fork()==-1){} // first fork
if(fork()==0){} // second fork
要:
pid = fork();
if(pid == -1)
{
... //failed
}
else if(pid == 0)
{
... //success
}
或者使用switch语句:
switch(fork())
{
case -1:
... // failed
break;
case 0:
... // success
break;
}
答案 1 :(得分: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);
}