免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 41070 | 回复: 42

_exit和exit的区别? (无内容) [复制链接]

论坛徽章:
0
发表于 2002-02-27 15:46 |显示全部楼层

论坛徽章:
0
发表于 2002-02-27 16:41 |显示全部楼层

_exit和exit的区别? (无内容)

以前好象看到过
_exit()不执行I/O缓存的刷新动作
其他的区别就不知道了。

论坛徽章:
0
发表于 2002-02-27 16:57 |显示全部楼层

_exit和exit的区别? (无内容)

exit()在结束调用它的进程之前,要进行如下步骤:
1.cleanup();
2.在atexit()注册的函数;
最后调用_exit()函数。。。

论坛徽章:
0
发表于 2002-02-28 08:30 |显示全部楼层

_exit和exit的区别? (无内容)

我记得这两个函数不是随便可替换的,好象在FORK一个子进程时用起来就很有讲究,但是具体不知道有什么关系

论坛徽章:
0
发表于 2002-03-01 08:42 |显示全部楼层

_exit和exit的区别? (无内容)

slackerqxl说的是对的

论坛徽章:
0
发表于 2002-03-01 17:53 |显示全部楼层

_exit和exit的区别? (无内容)

1.1.3 为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?
-----------------------------------------------------------------

‘exit()’与‘_exit()’有不少区别在使用‘fork()’,特别是‘vfork()’时变得很
突出。

‘exit()’与‘_exit()’的基本区别在于前一个调用实施与调用库里用户状态结构
(user-mode constructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序
(译者注:自定义清除程序由atexit函数定义,可定义多次,并以倒序执行),相对
应,后一个函数只为进程实施内核清除工作。

在由‘fork()’创建的子进程分支里,正常情况下使用‘exit()’是不正确的,这是
因为使用它会导致标准输入输出(译者注:stdio: Standard Input Output)的缓冲区被
清空两次,而且临时文件被出乎意料的删除(译者注:临时文件由tmpfile函数创建
在系统临时目录下,文件名由系统随机生成)。在C++程序中情况会更糟,因为静
态目标(static objects)的析构函数(destructors)可以被错误地执行。(还有一些特殊情
况,比如守护程序,它们的*父进程*需要调用‘_exit()’而不是子进程;适用于绝
大多数情况的基本规则是,‘exit()’在每一次进入‘main’函数后只调用一次。)

在由‘vfork()’创建的子进程分支里,‘exit()’的使用将更加危险,因为它将影响
*父*进程的状态

摘自:http://www.whitecell.org/forums/viewtopic.php?topic=67&forum=6&2

论坛徽章:
0
发表于 2002-10-31 00:02 |显示全部楼层

_exit和exit的区别? (无内容)

_exit终止调用进程,但不关闭文件,不清除输出缓存,也不调用出口函数。
exit函数将终止调用进程。在退出程序之前,所有文件关闭,缓冲输出内容
将刷新定义,并调用所有已刷新的“出口函数”(由atexit定义)。

论坛徽章:
0
发表于 2005-04-15 10:09 |显示全部楼层

_exit和exit的区别? (无内容)

#include        <sys/types.h>;
#include        "ourhdr.h"

int             glob = 6;               /* external variable in initialized data */

int
main(void)
{
        int             var;            /* automatic variable on the stack */
        pid_t   pid;

        var = 88;
        printf("before vfork\n";       /* we don't flush stdio */

        if ( (pid = vfork()) < 0)
                printf("vfork error\n";
        else if (pid == 0) {            /* child */
                glob++;                                 /* modify parent's variables */
                var++;
                exit(0);                                /* child terminates */
        }

        /* parent */
        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
        exit(0);
}

我在linux6.2的机器上试了一下,还是有printf的内容输出:pid = 29650, glob = 7, var = 89
请dx解惑,谢谢

论坛徽章:
0
发表于 2005-04-15 10:12 |显示全部楼层

_exit和exit的区别? (无内容)

#include        <sys/types.h>;
#include        "ourhdr.h"

int             glob = 6;               /* external variable in initialized data */

int
main(void)
{
        int             var;            /* automatic variable on the stack */
        pid_t   pid;

        var = 88;
        printf("before vfork\n";       /* we don't flush stdio */

        if ( (pid = vfork()) < 0)
                printf("vfork error\n";
        else if (pid == 0) {            /* child */
                glob++;                                 /* modify parent's variables */
                var++;
                exit(0);                                /* child terminates */
        }

        /* parent */
        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
        exit(0);
}

我在linux6.2的机器上试了一下,还是有printf的内容输出:pid = 29650, glob = 7, var = 89
请dx解惑,谢谢

论坛徽章:
0
发表于 2005-04-15 10:16 |显示全部楼层

_exit和exit的区别? (无内容)

>;>;我在linux6.2的机器上试了一下,还是有printf的内容输出:pid = 29650, glob = 7, var = 89

本来就该这样啊,有什么疑义吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP