程序中fork()的定义

时间:2016-01-07 04:27:33

标签: unix operating-system system-calls

我研究过fork()调用会在程序中调用它创建一个新进程。

但是在以下两个非常相似的程序中,它表现出不同的行为。这是为什么?

计划1:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    printf("Start %d ", getpid()) ; 
    pid_t pid = fork() ;
    if (pid > 0)
        printf("Parent %d ", getpid()) ; 
    if (pid == 0)
        printf("Child %d ", getpid()) ;
    return 0 ; 
}

输出为:

Start 1104 Parent 1104 Start 1104 Child 1105

计划2:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    printf("Start %d \n", getpid()) ; 
    pid_t pid = fork() ;
    if (pid > 0)
        printf("Parent %d \n", getpid()) ; 
    if (pid == 0)
        printf("Child %d \n", getpid()) ;
    return 0 ; 
}

输出为:

Start 1126 
Child 1127 
Parent 1126 

只包括&#34; \ n&#34;改变输出。是什么原因造成的?

1 个答案:

答案 0 :(得分:5)

如果您要在父级和子级中使用流,则需要在fork之前刷新它。否则,缓冲区中剩余的内容将被刷新两次,一次由父级刷新,一次由子级刷新。

此外,您不应该从父母和孩子的main返回。如果这样做,任何atexit处理程序将运行两次。这导致了过去的安全隐患。父母或子女要么致电_exit,要么成功致电其中一个exec职能。