我在执行这个程序

#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。现在父母和孩子都认为他们是父母。

10-06 15:06