C 为什么fork()返回errno=22

C 为什么fork()返回errno=22,c,linux,process,fork,C,Linux,Process,Fork,我有一个简单的程序如下:- int main(int argc, const char * argv[]) { printf ("Before Fork [%d][%d:%s]\n",getpid(),errno,strerror(errno)); pid_t pid = fork(); if (!pid) //CHILD PROCESS { printf ("In Child Process [%d [%d:%s]\n",getpid(),errno,strerr

我有一个简单的程序如下:-

int main(int argc, const char * argv[]) 
{
  printf ("Before Fork [%d][%d:%s]\n",getpid(),errno,strerror(errno));
  pid_t pid = fork();

  if (!pid) //CHILD PROCESS
  {
    printf ("In Child Process [%d  [%d:%s]\n",getpid(),errno,strerror(errno));
  }
  else 
  {
   while(1);
  }
}
这将产生以下输出:-

Before Fork [50083][0:Undefined error: 0]
In Child Process [50084][22:Invalid argument]

有人知道为什么操作系统在FORK之后立即抛出无效参数错误吗

这只是猜测,但可能是因为fork变成了syscall clone()(查看strace):

克隆(2)主页上说:

指定零值时clone()返回的EINVAL 对于child_堆栈

我没有浏览内核代码,但可能是因为
child\u stack=0
而设置了errno,但是由于标记的原因,在完成子项创建时没有出错


再说一遍。。。。strace可能会搞砸,因为SIGCHLD不可能作为克隆标志

。选择的答案也适用于你。如果
fork()
成功,则在
errno
中没有要设置的特定值;只有当它失败了,你才能相信它是有原因的。如果你有疑问,明天可能是33天。请阅读相关手册页。在本例中,“它的值只有在调用的返回值指示错误时才有效”您正在运行什么操作系统?@everyone:-正如WhozCraig和michi所提到的,由于fork工作(不返回-1),我们不能(不应该)处理errno值。否。使用
errno
是未定义的行为,除非前面的函数调用失败(在本例中没有失败)。我没有说它是在规范中定义的。我正在调查原因。有些东西改变了,errno,唯一的嫌疑犯似乎是写入和克隆。我不认为这是因为写作。
6952  write(1, "Before Fork [6952][0:Success]\n", 30) = 30
6952  clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f55f10e19d0) = 6953
6953  write(1, "In Child Process [6953  [0:Succe"..., 36) = 36