here's a weird thing I found today on Mac OSX.
After a fork, which has succeeded, errno is set at 0
in the father's process (as expected), but set at 22 in the child process.
Here's the source-code :
#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.
", errno);
if ((pid = fork()) == -1){
perror("Fork failed.");
exit(1);
}
if (pid == 0){
printf("Child : errno value : %d.
", errno);
}else{
printf("Father : pid value : %d ; errno value : %d.
", pid, errno);
wait(NULL);
}
exit(0);
}
And the execution track :
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.
As far as I know, and according to the Opengroup specifications,
"The new process (child process) shall be an exact copy of the calling process (parent process) except as detailed below [...]", including the value of the global variable errno -_-
Does anyone have a clue to explain that undesired behavior ?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…