弱弱地问一句~~main函数中的return语句问题

Fuz 发布于 2012/06/13 23:42
阅读 475
收藏 1
猛然发现我在论坛里的问题都很弱,完全是菜鸟级别的啊~没办法,水平尚待提高啊~~
因此再次挺起弱弱的胸膛,弱弱地问个弱弱的问题:
一般来说,操作系统在进行进程调度的时候,必须要明确被告知所有进程的当前状态,以便进行清理或者调度执行。现在考虑一个非无限循环执行任务的程序,在C语言中 此程序有两种退出的方法:
1、显式调用 exit()族的函数陷入内核使系统获知;
2、在main函数中使用 return 语句。
在上述情况 1 下,exit()函数可以引发系统调用从而通知内核进程结束。但是在情况 2 时,除非编译器在编译时隐式地调用 exit 以陷入内核,否则内核似乎无从知道进程已经结束了,因此在下一次进程调度时系统会出错。所以按照这个思路,我用gcc简单编译了一个程序,然后查看编译生成的.s汇编文件,发现并没有调用exit()族的函数,这就有点难以理解了。
哪位大牛给我解解此惑?
加载中
0
开车中国
开车中国

system->crt->main()

void crt()

{

main();

exit();

}

//上面是内部实现的,下面是你写的代码。你生成的汇编代码只是下面的。

void main()

{

return;

}

0
OrionBox
OrionBox
返回出去?表示我也不知道,同求
0
周翼翼
周翼翼

CRT里有eixt().

int main()
{
    return 0;
}

一路F11运行,你就看见了.vc6下有:

00401129   add         esp,0Ch
0040112C   mov         dword ptr [mainret],eax
0040112F   mov         edx,dword ptr [mainret]
00401132   push        edx
00401133   call        exit (00401210)
$L17377:
00401138   mov         eax,dword ptr [ebp-14h]
0040113B   mov         ecx,dword ptr [eax]
0040113D   mov         edx,dword ptr [ecx]
0040113F   mov         dword ptr [ebp-20h],edx
00401142   mov         eax,dword ptr [ebp-14h]
00401145   push        eax
00401146   mov         ecx,dword ptr [ebp-20h]
00401149   push        ecx
0040114A   call        _XcptFilter (004013a0)
0040114F   add         esp,8
$L17379:
00401152   ret
$L17378:
00401153   mov         esp,dword ptr [ebp-18h]
00401156   mov         edx,dword ptr [ebp-20h]
00401159   push        edx
0040115A   call        _exit (00401230)

看见call _exit了吧.

0
Fuz
Fuz

引用来自“周翼翼”的答案

CRT里有eixt().

int main()
{
    return 0;
}

一路F11运行,你就看见了.vc6下有:

00401129   add         esp,0Ch
0040112C   mov         dword ptr [mainret],eax
0040112F   mov         edx,dword ptr [mainret]
00401132   push        edx
00401133   call        exit (00401210)
$L17377:
00401138   mov         eax,dword ptr [ebp-14h]
0040113B   mov         ecx,dword ptr [eax]
0040113D   mov         edx,dword ptr [ecx]
0040113F   mov         dword ptr [ebp-20h],edx
00401142   mov         eax,dword ptr [ebp-14h]
00401145   push        eax
00401146   mov         ecx,dword ptr [ebp-20h]
00401149   push        ecx
0040114A   call        _XcptFilter (004013a0)
0040114F   add         esp,8
$L17379:
00401152   ret
$L17378:
00401153   mov         esp,dword ptr [ebp-18h]
00401156   mov         edx,dword ptr [ebp-20h]
00401159   push        edx
0040115A   call        _exit (00401230)

看见call _exit了吧.

	.file	"t.c"
	.text
	.globl	main
	.type	main, @function 
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -4(%rbp)
	movq	%rsi, -16(%rbp)
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbits

表示gcc下这个文件 的汇编文件如上,根本没有 exit 的调用。额……

周翼翼
周翼翼
在CRT里.
0
Jooooooker
Jooooooker
应该是在CRT里面
0
中山野鬼
中山野鬼
楼主找几篇执行文件的组成的文章看看就知道了。
0
mallon
mallon
在crt动态库里,不在程序里
返回顶部
顶部