我已经读过系统函数在内部使用execl,fork和wait函数。所以,我试图模拟系统的工作而不使用它。但我无法实现同样的工作。
当我们使用系统函数调用程序时,下面的代码(之后)system()函数调用也会执行。所以为了模拟系统功能,我在下面编写了这段代码:
int main()
{
printf("In controller Start: %d\n\n",getpid());
system("./prog1");
printf("Forking New Process %d\n\n",fork());
printf("Process Id: %d\n\n",getpid());
execl("./infinite",0);
printf("In controller End\n\n");
return 0;
}
在运行“无限”程序后的上述代码中,最后一行没有打印出来。
即printf("In controller End\n\n");
如何打印最后一行并执行“无限”程序而不使用系统功能。
如果有人能够解释系统功能的逐步工作,如系统首先调用哪个函数等等,那将是很好的。
为什么执行不会持续到最后一行,如果我们在execl之外进行一个简单的函数调用就必须这样做。
脚注: - 无限:是使用C代码创建的二进制文件。
答案 0 :(得分:5)
最后一行不会被打印,因为它永远不会被执行。如果一切正常,execl
函数永远不会返回,而是将程序替换为调用中的程序。
简而言之,fork
将当前进程拆分为两个,并根据返回父进程或子进程的不同而返回。然后在子进程中进行exec
调用,而父进程继续执行它想要的操作。但是,父项必须{child}才能完成子进程,否则子进程将成为所谓的wait
。
在您的代码中,两者父和子进程调用exec
。
答案 1 :(得分:2)
在您的示例中,您在父进程和子进程中执行相同的操作。您必须检查fork的返回值,该值指示您是在父级还是子级中,然后在主进程中等待时在子级中执行。
答案 2 :(得分:2)
这是fork的基础
/*previous code*/
if((cpid=fork())<0){
printf("\n\tFORK ERROR");
exit(1);
}
if(cpid==0){ /*SON*/
/*CODE FOR SON-your `execl("./infinite",0);` goes here*/
}else{ /*FATHER*/
/*CODE FOR FATHER-your `printf("In controller End\n\n");` */
}
不要忘记在制作fork内存并将变量复制到SON pid
时答案 3 :(得分:2)
当您调用fork()
时,父进程和子进程都会从该点继续执行相同的代码,但fork()
的返回值各不相同。通常,您会根据返回值执行一些条件逻辑。
我认为system()
做的是这样的事情:
int childpid = fork();
if (childpid) {
/* This is the parent */
wait( childpid );
} else {
/* This is the child */
execl( program_name );
}
由于execl()
用新的可执行文件替换当前的可执行文件,因此子项将运行该可执行文件然后结束。父母将等待孩子完成然后继续。
答案 4 :(得分:1)
您没有根据fork
的返回值执行任何类型的条件语句。如果你没有确保一个进程执行exec
而另一个进程执行其他操作,则两者都会执行相同的操作。
您通常要检查0
,然后执行要运行的程序。 0
表示一切正常,您正处于子进程中。
答案 5 :(得分:0)
int main()
{
int pid;
printf("In controller Start: %d\n\n",getpid());
system("./prog1");
pid = fork();
printf("Forking New Process %d\n\n",pid);
printf("Process Id: %d\n\n",getpid());
if (pid == 0) { /* Son process : execute the command */
execl("./infinite",0);
} else { /* Original process : keep working */
printf("In controller End\n\n");
return 0;
}
}