询问一个关于fork以后函数执行问题

tianshilei1992 2012-10-30 11:46:22
正在自学《UNIX环境高级编程》,看到第八章进程控制这里有一个程序,如下:

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

int glob = 6;
char buf[] = "a write to stdout\n";

int
main(void)
{
int var;
pid_t pid;

var = 88;
if (write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)
{
printf("write error");
return;
}
printf("before fork\n");

if ((pid = fork()) < 0)
{
printf("fork error");
return;
}
else if (pid == 0)
{
glob++;
var++;
printf("test1\n");
}
else
{
printf("sleep\n");
sleep(2);
}

printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}

不清楚为什么倒数第三行那个printf语句会被执行两次?请教各位这个函数的执行顺序。是不是子进程会将main函数重新执行一遍?还是只在if和else语句里面执行第二遍?用GDB跟踪也没看出啥结果来……
另外请教一下大家,看Unix/Linux环境编程入门类的书看什么啊?我总觉得这个APUE有点看不来……
...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
JiMoKuangXiangQu 2012-10-30
  • 打赏
  • 举报
回复
因为代码被父子进程共享,
if ((pid = fork()) < 0)
{
printf("fork error");
return;
}
else if (pid == 0)
{
glob++;
var++;
printf("test1\n");
}
else
{
printf("sleep\n");
sleep(2);
}

这几句代码用进程ID判定,进入各自的分支.


printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);

而倒数第二句没有条件判断,父子进程都会执行到.
HMGuardian 2012-10-30
  • 打赏
  • 举报
回复
楼上正解,但有一词要换一下,不是共享而是复制,vfork才是共享。
fork调用会生成一个新的进程并将原程序的代码段,数据段,堆栈空间等复制到新进程的地址空间中,成为父进程的一个副本。在有写时复制机制的系统中代码段并不会立即被复制,而是将原程序的代码段直接映射到新进程。但数据段、堆栈空间等都是独立的。
vfork调用则不同,它所生成的新进程所有东西都是父进程的。直到用execX系列函数调用新的程序时才将新程序的代码,数据等复制到自己的进程空间,并创建自己的堆栈。

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧