我在执行这个程序
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid;
pid = getpid();
printf("my pid is %d", pid);
fork();
pid = getpid();
if(pid < 0) {
printf("error creating child process");
exit(1);
}
if(pid > 0) {
printf("\n my child's pid is %d \n", pid);
exit(0);
}
printf("hello from child process, im still running");
return 0;
}
我希望结果是:
my pid is 5830
my child's pid is 5831
hello from child process, i'm still running
但我得到了这些结果:
my pid is 5830
my child's pid is 5830
my pid is 5830
my child's pid is 5831
我做错什么了?好吧,正如标题所示,
我在我的mac上运行这个-10.9.2和
gcc --version returns :
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
最佳答案
您的第一个printf
调用在字符串末尾没有换行符。写操作将被缓冲,当发生fork
时,您将得到两个进程,每个进程都有缓冲区的副本。当父级和子级下一次调用printf
并包含换行符时,缓冲区将被刷新,从而导致重复。在字符串末尾添加新行以修复重复。
您还需要检查fork
(而不是getpid
)的返回值,以确定您是在父级还是子级。getpid
中的子项将返回实际的pid,而不是0。现在父母和孩子都认为他们是父母。