C中的系统功能是如何工作的
我已经读到系统函数在内部使用execl、fork和wait函数。所以,我尝试在不使用它的情况下模拟系统的工作。但我无法实现同样的工作 当我们使用system function调用程序时,下面的代码(在system()函数调用之后)也会执行。为了模拟系统功能,我编写了以下代码:C中的系统功能是如何工作的,c,unix,C,Unix,我已经读到系统函数在内部使用execl、fork和wait函数。所以,我尝试在不使用它的情况下模拟系统的工作。但我无法实现同样的工作 当我们使用system function调用程序时,下面的代码(在system()函数调用之后)也会执行。为了模拟系统功能,我编写了以下代码: int main() { printf("In controller Start: %d\n\n",getpid()); system("./prog1"); printf("Forking New
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;
}
在上面运行“无限”程序后的代码中,最后一行不会被打印出来。
i、 e.printf(“在控制器端\n\n”)代码>
在不使用系统功能的情况下,如何打印最后一行并执行“无限”程序
如果有人能解释系统函数的一步一步地工作,比如系统首先调用哪个函数等等,那就太好了
为什么执行并没有继续到最后一行,就像我们做了一个简单的函数调用而不是execl时必须做的那个样
足注:-
无限:是使用C代码创建的二进制文件。最后一行不会打印,因为它从未执行过。如果一切正常,execl
函数永远不会返回,而是用调用中的程序替换您的程序
我强烈建议您阅读和的手册页面
简而言之,fork
将当前进程一分为二,并根据返回到父进程还是子进程而不同地返回。然后在子进程中执行exec
调用,而父进程继续执行它想要的操作。但是,父进程必须在子进程上完成,否则子进程将成为所谓的
在您的代码中,父进程和子进程都调用exec
在您的示例中,父进程和子进程都执行相同的操作。您必须检查fork的返回值,它指示您是在父进程中还是在子进程中,然后在主进程中等待时在子进程中执行 您没有根据fork
的返回值执行任何类型的条件语句。如果您不确保一个进程执行exec
,另一个进程执行其他操作,那么这两个进程将执行相同的操作
您通常希望对照0
进行检查,然后执行要运行的程序<代码>0
表示一切正常,您处于子进程中。这是fork的基础
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;
}
}
/*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()
时((cpid=fork()),则父进程和子进程都会从该点继续执行相同的代码,但是fork()
的返回值各不相同。通常,您会基于该返回值执行一些条件逻辑
我可以想象,system()
会做这样的事情:
int childpid = fork();
if (childpid) {
/* This is the parent */
wait( childpid );
} else {
/* This is the child */
execl( program_name );
}
因为execl()
用一个新的可执行文件替换了当前的可执行文件,所以子文件将运行该可执行文件,然后结束。父文件将等待子文件完成,然后继续。他执行fork,只是他在两个结果进程中执行相同的操作。啊,这是真的。它隐藏得很好:)@msatyam你能帮我做一次投票吗,因为我的请求权被取消了,我需要他们回来,我以前是多么的愚蠢