我有一个简单的程序,如下所示: -
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之后立即抛出INVALID ARGUMENT错误?
答案 0 :(得分:-1)
这只是猜测,但可能是因为fork成为系统调用clone()(看一个strace):
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
并且clone(2)manpage说:
EINVAL指定零值时由clone()返回 for child_stack。
我没有浏览内核代码,但也许是因为child_stack=0
而设置了errno,但是因为标志而完成了子代的创建而没有错误。
然后......由于SIGCHLD无法作为克隆标志,因此可以搞砸了。