我一直在试图弄清楚fork exec机制在Linux中是如何使用的.一切都按照计划进行,直到一些网页开始让我困惑.

据说子进程应该严格使用_exit(),而不是简单的exit()main()的正常返回.

据我所知,Linux shellForking 执行每个外部命令;假设我上面所说的是真的,那么结论是这些外部命令或Linux shell内部发生的任何其他执行都不能正常返回!

维基百科;其他一些网页声称,我们必须使用_exit(),只是为了防止子进程删除父进程的临时文件,同时可能会发生stdio缓冲区的双重刷新.虽然我理解前者,但我不知道缓冲区的双重刷新如何对Linux系统有害.

我一整天都在这上面...

推荐答案

exec失败时,您应该使用_exit(或其同义词_Exit)中止子程序,因为在这种情况下,子进程可能会通过调用其atexit处理程序、调用其信号处理程序和/或刷新缓冲区来干扰父进程的外部数据(文件).

出于同样的原因,在任何不使用exec的子进程中,也应该使用_exit,但这种情况很少见.

在所有其他情况下,只需使用exit.正如您部分提到的,Unix/Linux中的every进程(除一个init外)是另一个进程的子进程,因此在每个子进程中使用_exit意味着exitinit之外是无用的.

switch (fork()) {
  case 0:
    // we're the child
    execlp("some", "program", NULL);
    _exit(1);  // <-- HERE
  case -1:
    // error, no fork done ...
  default:
    // we're the parent ...
}

C++相关问答推荐

为什么这个gcc迂腐的人忽视了扩展?

try 使用libusb控制音量时LIBUSB_WRIGHT_PIPE

问关于C中的指针和数组

C/C++中的状态库

错误:C中需要参数声明符

找出文件是否包含给定的文件签名

C中是否有语法可以直接初始化一个常量文本常量数组的 struct 成员?

从组播组地址了解收到的数据包长度

将整数的.csv文件解析为C语言中的二维数组

测量ARM MCU中断延迟的问题

使用C时,Windows CMD中的argc参数是否包含重定向命令?

C在声明带有值的数组时,声明大小有用吗?

ifdef __cplusplus中的整数文字单引号

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

如何使用 VLA 语法使用 const 指针声明函数

free后内存泄漏?

为什么创建局部变量的指针需要过程在堆栈上分配空间?

clion.我无法理解 Clion 中发生的 scanf 错误

如何使用 raylib 显示数组中的图像

`void foo(int a[static 0]);` 有效吗?