从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在同一个进程中被调用,而第一个被系统调用