阿波121 2014-05-30 05:22
浏览 934

关于vfork和fork运行过程

1 #include
2 #include
3 #include
4
5
6
7 int glob = 6;
8 char buf[] = "a write to stdout\n";
9
10 void err_sys(char str)
11 {
12 if (*str)
13 printf("%s\n", str);
14 }
15
16 int my_vfork(void)
17 {
18 int var = 66;
19 pid_t pid;
20
21 printf("before vfork\n");
22 if ((pid = vfork()) < 0)
23 err_sys("vfork error");
24 else if (pid == 0) {
25 glob++; var++;
26 _exit(0);
27 }
28 /*parent
/
29 printf("pid = %d, glob = %d, var = %d\n", pid, glob, var);
30 exit(0);
31 }
32
33 void my_fork(void)
34 {
35 int var = 88;
36 pid_t pid;
37
38 if (write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)
39 err_sys("write error");
40 printf("before fork\n");
41
42 if ((pid = fork()) < 0)
43 err_sys("fork error\n");
44 else if (pid == 0) {
45 glob++;
46 var++;
47 }
48 else
49 sleep(2);
50
51 printf("pid = %d, glob = %d, var = %d\n", pid, glob, var);
52 }
53
54 int main(int argc, char *argv[])
55 {
56 my_fork();
57 sleep(5);
58 printf("sleep 10 sec!\n");
59 my_vfork();
60
61 return 0;
62 }
63
为什么上面这段代码的运行结果是:
a write to stdout
before fork
pid = 0, glob = 7, var = 89
pid = 9706, glob = 6, var = 88
sleep 10 sec!
before vfork
pid = 9708, glob = 8, var = 67
sleep 10 sec!
before vfork
pid = 9709, glob = 7, var = 67
当main函数为:
54 int main(int argc, char *argv[])
55 {
56 // my_fork();
57 // sleep(5);
58 printf("sleep 10 sec!\n");
59 my_vfork();
60
61 return 0;
62 }
运行结果为:
sleep 10 sec!
before vfork
pid = 9746, glob = 7, var = 67
为什么当没有fork的时候vfork只运行一次,但前面有fork的时候vfork会多运行一次?

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 数学的三元一次方程求解
    • ¥20 iqoo11 如何下载安装工程模式
    • ¥15 本题的答案是不是有问题
    • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
    • ¥15 C++使用Gunplot
    • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
    • ¥15 matlab数字图像处理频率域滤波
    • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
    • ¥15 ELGamal和paillier计算效率谁快?
    • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题