【发布时间】:2013-12-16 04:42:44
【问题描述】:
这是我今天在 Mac OSX 上发现的一个奇怪的东西。
分叉成功后,errno 设置为 0 在父亲的进程中(如预期的那样),但在子进程中设置为 22。 这是源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main(int nbArgs, char** args){
int pid;
errno = 0;
printf("Errno value before the call to fork : %d.\n", errno);
if ((pid = fork()) == -1){
perror("Fork failed.");
exit(1);
}
if (pid == 0){
printf("Child : errno value : %d.\n", errno);
}else{
printf("Father : pid value : %d ; errno value : %d.\n", pid, errno);
wait(NULL);
}
exit(0);
}
还有执行轨迹:
Remis-Mac:TP3 venant$ ./errno_try
Errno value before the call to fork : 0.
Father : pid value : 9526 ; errno value : 0.
Child : errno value : 22.
据我所知,根据Opengroup specifications, “新进程(子进程)应是调用进程(父进程)的精确副本,除非下文详述 [...]”,包括全局变量 errno 的值 -_-
有没有人可以解释这种不受欢迎的行为?
【问题讨论】:
-
这并不是特别不受欢迎的。大多数成功的系统调用都不需要设置 errno,并且 errno 可以是一个宏并且是特定于线程的。
-
你是对的鸭子,这不是不可取的,但这种行为有时会误导......