Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的系统功能是如何工作的_C_Unix - Fatal编程技术网

C中的系统功能是如何工作的

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

我已经读到系统函数在内部使用execl、fork和wait函数。所以,我尝试在不使用它的情况下模拟系统的工作。但我无法实现同样的工作

当我们使用system function调用程序时,下面的代码(在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;
}
在上面运行“无限”程序后的代码中,最后一行不会被打印出来。 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你能帮我做一次投票吗,因为我的请求权被取消了,我需要他们回来,我以前是多么的愚蠢