猛然发现我在论坛里的问题都很弱,完全是菜鸟级别的啊~没办法,水平尚待提高啊~~
因此再次挺起弱弱的胸膛,弱弱地问个弱弱的问题:
一般来说,操作系统在进行进程调度的时候,必须要明确被告知所有进程的当前状态,以便进行清理或者调度执行。现在考虑一个非无限循环执行任务的程序,在C语言中 此程序有两种退出的方法:
1、显式调用 exit()族的函数陷入内核使系统获知;
2、在main函数中使用 return 语句。
在上述情况 1 下,exit()函数可以引发系统调用从而通知内核进程结束。但是在情况 2 时,除非编译器在编译时隐式地调用 exit 以陷入内核,否则内核似乎无从知道进程已经结束了,因此在下一次进程调度时系统会出错。所以按照这个思路,我用gcc简单编译了一个程序,然后查看编译生成的.s汇编文件,发现并没有调用exit()族的函数,这就有点难以理解了。
哪位大牛给我解解此惑?
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了吧.######
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动态库里,不在程序里
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。