从main调用main是否会生成一个新进程?



从main调用main是否会为被调用的main生成一个新进程,还是在同一进程中调用main ?

我读到main返回的值是由执行它的进程返回的

不创建新进程。它只是在同一个进程中调用一个函数。

#include<stdio.h>
#include<stdlib.h>
int start=1;
int main()
{
    if (start) {
        printf("in first call to main, pid=%dn",getpid());
        start=0;
        return main();
    } else {
        printf("in second call to main, pid=%dn",getpid());
        return 1;
    }
}
输出:

in first call to main, pid=15482
in second call to main, pid=15482

进程退出,状态为1

它不会创建另一个进程,但它会在自己内部嵌套main()。会发生一些奇怪的事情。如果你没有显式地告诉main你已经完全完成了,它将继续运行并且进程不会终止;因为对main的原始调用尚未完成。当你调用它时,它会嵌套在自身内部。

好问题。当我第一次学习C时,我有一个弹出式。我在最后使用main来重新运行所有内容,而不仅仅是使用循环。我的老师说这不是一个好的做法。

我读到main函数返回的值是由执行它的进程返回的。

这是因为C运行时将调用main(),并在它执行后做一些操作系统特定的东西来设置退出状态为main()返回的任何状态。然而,main()没有什么特别之处,它只是一个正常的函数。

这特别意味着它不是程序的入口点…真正的入口点由链接到您的程序的C运行时提供,并且从那里调用main()

作为一个例子,看看我最近为自己的DOS .COM可执行文件运行时写的一些代码:

__asm__ (
        "   .section    .comstartup             n"
        "   .globl      __com__start            n"
        /* THIS is the real entry point, call a function to get some info
         * about the console and then jump to a function getting command
         * line arguments from DOS and calling main */
        "__com__start:                          n"
        "   call        _getcinfo               n"
        "   jmp         argstart                n"
        "   .text                               n");
void __attribute__((__noreturn__)) exit(int status)
{
    /* this just calls the DOS function for exiting with exit status */
    __asm__ volatile (
            "mov    $0x4c, %%ah     nt"
            "int    $0x21           nt"
            :
            : "a" (status)
            );
    __builtin_unreachable();
}
static void argstart(void)
{
    char *cmdline = (char *)0x81;
    argc = 1;
    argv[0] = progname();
    {
        /* some code to populate argv[] */
        [....]
    }
    /* and this could be a quite typical line in any C runtime, just
     * call exit() with whatever main() returns: */
    exit(main(argc, argv));
}

main函数在同一进程中调用,可以通过打印getpid()返回的值来检查,如下所示:

int main(){
   static int i = 2;
   if (i>0){
      int pid1 = getpid();
      printf("Main: %dn", pid1);
      i--;
      main();
   }
}

输出为

Main: 32323
Main: 32323

确认main在同一个进程中被调用,而第一个被系统调用

相关内容

  • 没有找到相关文章

最新更新