代码之家  ›  专栏  ›  技术社区  ›  helpermethod

如何退出子进程-_exit()与exit

  •  42
  • helpermethod  · 技术社区  · 16 年前

    请考虑以下代码段:

    pid_t cpid = fork();
    
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    
    if (cpid == 0) { // in child
        execvp(argv[1], argv + 1);
        perror("execvp");
        _exit(EXIT_FAILURE);
    }
    
    // in parent
    

    如果execvp返回,如何退出子进程?我应该使用exit()还是exit()?

    5 回复  |  直到 9 年前
        1
  •  47
  •   Variable Length Coder    16 年前

    你一定要用 _Exit() . exit() 调用添加的函数 atexit() 并删除用创建的文件 tmpfile() . 因为父进程实际上是希望在它存在时完成这些事情的进程,所以应该调用 退出() 但这些都不行。

    通知 退出() 大写E。 _exit(2) 可能不是您想直接呼叫的。 exit(3) _Exit(3) 会给你打电话的。如果你没有 出口(3) ,然后是, _exit() 是你想要的。

        2
  •  15
  •   Joshua    16 年前

    fork()的子级应始终调用_exit()。

    相反,调用exit()是导致挂起的stdio缓冲区刷新两次的好方法。

        3
  •  3
  •   Nicolas Guillaume    16 年前

    如果成功,execvp将退出子级,因此您不必退出。

    在执行失败时,我只使用 exit(EXIT_FAILURE); 在孩子身上。

    编辑:经过研究发现: http://www.unixguide.net/unix/programming/1.1.3.shtml

    所以看起来最好用 _exit() 特别是当你在C++中的一个叉子:P 谢谢你的问题,我学到了一些东西。

        4
  •  1
  •   jabbie    16 年前

    这取决于您想要的行为: man -s 3 exit man _exit 有关系统的详细信息。一般来说,我认为exit不会运行在atexit()中注册的函数,而exit会运行(这些函数最好不要调用exit,否则会得到递归)。

    一般来说,除了在ATEXIT注册的函数中,如果需要的话,我更喜欢退出而不是退出。

        5
  •  0
  •   ImanKh    9 年前

    exit() 是ANSI-C函数,因此它是独立于操作系统的。它关闭所有的ANSI-C标准函数。 _exit() 被称为 退出() 关闭操作系统相关功能,因为 退出() 对他们一无所知。( exit 操作系统是否独立)