C中的系统功能如何工作

时间:2013-05-06 12:23:06

标签: c unix

我已经读过系统函数在内部使用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代码创建的二进制文件。

6 个答案:

答案 0 :(得分:5)

最后一行不会被打印,因为它永远不会被执行。如果一切正常,execl函数永远不会返回,而是程序替换为调用中的程序。

我强烈建议您阅读forkexecl的手册页。


简而言之,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;
    }
}