免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2955 | 回复: 9
打印 上一主题 下一主题

_exit函数的特殊作用吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-15 09:15 |只看该作者 |倒序浏览
[root@localhost demo]# cat fork.c
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t child;
if(!(child=fork()))
   {
    printf (" in child ");
   _exit(0);

   }
   printf("\n prient pid -- child pid %d\n",child);
return 0;

}

编译后执行,没有显示in child 这句
[root@localhost demo]# ./a.out

prient pid -- child pid 3465

而在printf (" in child ");改成printf (" \nin child \n");后,可以显示
[root@localhost demo]# ./a.out

in child

prient pid -- child pid 3465
请教大家,为什么不能显示,难道是_exit函数的作用?还有资料上说fork()返回值是随机的,但我试了很多边,都是先打印子进程,再打印父进程,难道是平台的缘故?(我用的是AS 4)??

论坛徽章:
0
2 [报告]
发表于 2008-06-15 11:07 |只看该作者
在 _exit() 之前加入 fflush(stdout) 就有输出了。
不大建议用 _exit() 这个函数。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2008-06-15 18:55 |只看该作者
APUE上有介绍exit()和_exit()的去别。

论坛徽章:
0
4 [报告]
发表于 2008-06-15 19:07 |只看该作者
感谢楼上两位的回复,但你们还是没有明白我问的问题,为什么加了两个“\n”之后就可以显示in child ,也许我的标题让大家误解了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2008-06-15 19:20 |只看该作者
好像先执行父进程还是子进程,顺序不是固定的

论坛徽章:
0
6 [报告]
发表于 2008-06-15 19:33 |只看该作者

回复 #5 Godbach 的帖子

“好像先执行父进程还是子进程,顺序不是固定的”  ,这个我当然知道,但在AS4平台实践了多次,都是先打印子进程,再打印父进程,所以有点郁闷(没有得到想像的结果)

论坛徽章:
0
7 [报告]
发表于 2008-06-15 22:11 |只看该作者
Whether it flushes standard
I/O buffers and removes temporary  files  created  with  tmpfile(3)  is
implementation-dependent.

我想可能是 _exit() 没有 flush 输出缓冲所以看不到输出。

论坛徽章:
0
8 [报告]
发表于 2008-06-16 10:29 |只看该作者
原帖由 wgqjjq 于 2008-6-15 19:33 发表
“好像先执行父进程还是子进程,顺序不是固定的”  ,这个我当然知道,但在AS4平台实践了多次,都是先打印子进程,再打印父进程,所以有点郁闷(没有得到想像的结果)


纯属偶然,呵呵,这和系统负载、体系结构有关,不能简单地说子进程一定比父进程先执行。
另外printf()如果不是以\n结束,就不会立即在屏幕打印,存放在缓冲区中,直到缓冲区满或者下一个遇到\n或者被强制fflush()才会输出。
__exit()直接退出,return()会进行一些缓冲区输出操作。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2008-06-16 20:32 |只看该作者
原帖由 wgqjjq 于 2008-6-15 19:07 发表
感谢楼上两位的回复,但你们还是没有明白我问的问题,为什么加了两个“\n”之后就可以显示in child ,也许我的标题让大家误解了

翻下 apue2 中关于缓冲模式的介绍也许有帮助。

论坛徽章:
0
10 [报告]
发表于 2008-06-17 17:23 |只看该作者
控制台是行缓冲的所以加上"\n"就可以输入了,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP