请教表现了系统调用exit(0)与_exit(0)区别的实例

pengfoo 2011-06-28 04:48:19
exit()函数与_exit()的区别是:
主要区别是_exit会立刻进入内核,而exit先执行一些清除工作(包括执行各种终止处理程序,关闭所有标准I/O等,一旦关闭了IO,例如Printf等函数就不会输出任何东西了),然后才进入内核。
我看的一本书上为阐述这两个函数的区别举了两个例子:
例一:
#include<stdlib.h>
#include<stdio.h>
main()
{
printf("output begin\n");
printf("content in buffer\n");
exit(0);
}
书上说最后的结果是:
output begin
content in buffer

例二:
#include<stdio.h>
#include<unistd.h>
main()
{
printf("output begin\n");
printf("content in buffer\n");
_exit(0);
}
书上说最后的结果是:
output begin

==================================================
可是,我在gcc编译器上编译,两者结果都是:
output begin
content in buffer

是不是书上错了?谁能给个两个区别的例子吗?谢谢!!!














...全文
244 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2011-07-06
  • 打赏
  • 举报
回复
自己试试不就清楚了吗
fengzhw 2011-07-06
  • 打赏
  • 举报
回复
对于换行符的flush应该是libc层面的事情,只能笼统地说:和编译器,libc,操作系统实现有关。
pengfoo 2011-06-29
  • 打赏
  • 举报
回复
去了第二行的 \n 后,两个程序的结果都变成只有
out begin
了!!看来这真的和编译器有关哪?![Quote=引用 7 楼 fengzhw 的回复:]
正好今天在linux版针对_exit做了实验。

第一,你得把第二行末尾的\n去掉;
第二,在AIX下这两个的运行结果确实不一样,我在VMWARE虚拟的LINUX下运行是一样的。

第三,你把自己运行的LINUX内核版本,编译器版本详细说说,大家也都试试,各自报告一下。
[/Quote]
pengfoo 2011-06-29
  • 打赏
  • 举报
回复

内核是2.6.35-22,我用的gcc版本是4.4.5[Quote=引用 7 楼 fengzhw 的回复:]
正好今天在linux版针对_exit做了实验。

第一,你得把第二行末尾的\n去掉;
第二,在AIX下这两个的运行结果确实不一样,我在VMWARE虚拟的LINUX下运行是一样的。

第三,你把自己运行的LINUX内核版本,编译器版本详细说说,大家也都试试,各自报告一下。
[/Quote]
Gloveing 2011-06-28
  • 打赏
  • 举报
回复
exit Performs complete C library termination procedures, terminates the process, and exits with the supplied status code.

_exit Performs “quick” C library termination procedures, terminates the process, and exits with the supplied status code.
vcf_reader 2011-06-28
  • 打赏
  • 举报
回复
貌似是换行符引起的
KevinHo 2011-06-28
  • 打赏
  • 举报
回复
实践出真知,可能这样的运行结果依赖于编译器,或者机器
都有可能吧,还是要研究实践的结果,书本的仅仅作为参考吧
5t4rk 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]
++不迷信书
辰岡墨竹 2011-06-28
  • 打赏
  • 举报
回复
我也觉得应该把\n去掉,因为stdout是行缓冲的,到了\n就自动刷新缓冲了,所以你用不用_exit()都一样。
fengzhw 2011-06-28
  • 打赏
  • 举报
回复
正好今天在linux版针对_exit做了实验。

第一,你得把第二行末尾的\n去掉;
第二,在AIX下这两个的运行结果确实不一样,我在VMWARE虚拟的LINUX下运行是一样的。

第三,你把自己运行的LINUX内核版本,编译器版本详细说说,大家也都试试,各自报告一下。
pengfoo 2011-06-28
  • 打赏
  • 举报
回复
额 05年出版的书[Quote=引用 3 楼 anyidan 的回复:]
可能书太旧了
[/Quote]
qq120848369 2011-06-28
  • 打赏
  • 举报
回复
看UNIX环境高级编程,妥妥的学会.
xunxun 2011-06-28
  • 打赏
  • 举报
回复
这个没什么缓冲 当然就输出了
应该举个fopen fclose之类的例子
AnYidan 2011-06-28
  • 打赏
  • 举报
回复
可能书太旧了
赵4老师 2011-06-28
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
Lactoferrin 2011-06-28
  • 打赏
  • 举报
回复
我猜printf立即输出了,没有缓冲起来

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧