开发者社区> 问答> 正文

弱弱地问一句~~main函数中的return语句问题 400 请求报错 

猛然发现我在论坛里的问题都很弱,完全是菜鸟级别的啊~没办法,水平尚待提高啊~~

因此再次挺起弱弱的胸膛,弱弱地问个弱弱的问题:

一般来说,操作系统在进行进程调度的时候,必须要明确被告知所有进程的当前状态,以便进行清理或者调度执行。现在考虑一个非无限循环执行任务的程序,在C语言中 此程序有两种退出的方法:

1、显式调用 exit()族的函数陷入内核使系统获知;

2、在main函数中使用 return 语句。

在上述情况 1 下,exit()函数可以引发系统调用从而通知内核进程结束。但是在情况 2 时,除非编译器在编译时隐式地调用 exit 以陷入内核,否则内核似乎无从知道进程已经结束了,因此在下一次进程调度时系统会出错。所以按照这个思路,我用gcc简单编译了一个程序,然后查看编译生成的.s汇编文件,发现并没有调用exit()族的函数,这就有点难以理解了。

哪位大牛给我解解此惑?

展开
收起
kun坤 2020-05-29 17:20:46 634 0
1 条回答
写回答
取消 提交回答
  • system->crt->main() void crt() { main(); exit(); } //上面是内部实现的,下面是你写的代码。你生成的汇编代码只是下面的。 void main() { return; }######返回出去?表示我也不知道,同求######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了吧.######

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

    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里.######应该是在CRT里面######楼主找几篇执行文件的组成的文章看看就知道了。 ######在crt动态库里,不在程序里
    2020-05-29 17:20:54
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载