1

我这里有两个代码示例

#include<stdio.h>
int main()
{
        int i = 0;
        i++;
        fork();
        printf("i - %d, pid - %d, addr -%p\n",i,getpid(),&i);
        return 0;
}

user@Ubuntu ~/Arena/c $ ./a
i - 1, pid - 6765, addr -0x7fffd892950c
i - 1, pid - 6766, addr -0x7fffd892950c

我的第二个程序是

#include<stdio.h>
int main()
{
        int i = 0;
        i++;
        printf("i - %d, pid - %d, addr -%p\n",i,getpid(),&i);
        fork();
        return 0;
}

user@Ubuntu ~/Arena/c $ ./b
i - 1, pid - 6772, addr -0x7fff39120f2c

好吧,据我所知,fork 应该从上到下创建父程序的完整副本并执行它,如果是这样,为什么fork()调用位置会产生如此大的差异?有人可以解释为什么printf在我的第二个程序中省略了吗?

4

3 回答 3

4

fork() 创建进程的副本,并在调用 fork() 时继续执行这两个进程。

因此,在您的第二个示例中,当只有一个进程时,您的 printf 在 fork 之前执行。

于 2013-11-05T15:27:37.027 回答
2

Fork 创建程序的完整副本,但从fork调用点继续执行。放在printf叉子后面,看看会发生什么。

通常,fork调用后会检查是否fork返回pid了孩子的。如果确实如此,那么您当前正在运行的进程是接收子进程的父进程,以便能够管理子进程,如果没有,那么您当前正在运行的进程就是子进程。

于 2013-11-05T15:27:41.777 回答
0

为了进一步的启发,请尝试:

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

int main(void)
{
    int i = 0;
    i++;
    printf("A: i - %d, pid - %d, addr -%p", i, getpid(), &i);
    fork();
    printf("\nB: i - %d, pid - %d, addr -%p\n", i, getpid(), &i);
    return 0;
}

第一个printf()不包含换行符,因此输出保存在内存中。第二个printf()包括换行符,因此输出出现在程序分叉后。A您应该在标记为;的两行中看到相同的信息。您应该在标记为 的两行中看到不同的信息B

在单线程应用程序中,父进程和子进程几乎相同,除了 PID、Parent PID 和fork(). 有关完整的详细信息,请参阅 POSIX 规范fork()

于 2013-11-05T15:35:11.880 回答