这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 关于fork和vfork的问题

共8条 1/1 1 跳转至

关于fork和vfork的问题

高工
2013-09-16 19:28:04     打赏

今天试了一下fork()和vfork().结果有一点不解.具体问题如下:

创建了一个.c文件,内容如下:

#include <unistd.h>
#include <stdio.h>
int main(void)
{
        pid_t pid;
        int count = 0;
        pid = fork();

        count++;
        printf("count=%d\n",count);
        return 0;
}

打印出的结果为:

count=1
count=1
这个结果能够理解,问题就出现在下面的实验.我将当前.c文件中的fork改为vfork之后编译执行后输出的结果为:

count=1
count=2
count=1
.

.

.

count=1
count=2
count=1
打印出了很多count=1和count=2

这个是为什么额,为什么不是打印出一次count=1和count=2






关键词: vfork     问题    

院士
2013-09-16 21:24:26     打赏
2楼

其实吧,我就有些不理解为什么会打印出来两次count=1,明明只有一个printf语句嘛……



高工
2013-09-16 22:13:56     打赏
3楼

fork函数创建子进程,会把父进程所有的代码复制运行。

自然就打印2次鸟,个人愚见。


高工
2013-09-16 22:16:43     打赏
4楼

看看你的vfork函数里面有没有退出或终结进程的语句?

貌似形成死循环了。


高工
2013-09-16 22:34:12     打赏
5楼
创建子进程失败但是输出的结果是1和2是正确的啊,,只不过不停的重复着

专家
2013-09-16 22:38:45     打赏
6楼
 #include <unistd.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <sys/types.h>
  5 #include <errno.h>
  6 int main(void)
  7 {
  8     pid_t pid;
  9     int count = 0;
 10     if(vfork()==0)
 11         printf("This is a child process\n");
 12     else
 13     {
 14         fprintf(stderr,"This is a parent process\n",strerror(errno));
 15         exit(-1);
 16     }
 17     count++;
 18     printf("count=%d\n",count);
 19     printf("pid=%d\n",pid);
 20 
 21     return 0;
 22 }


输出:

This is a child process
count=1
pid=13402100
This is a parent process

分析:子进程创建成功,则在子进程中返回0,父进程中返回子进程的PID


高工
2013-09-16 22:41:02     打赏
7楼
恩,我再试试

高工
2013-09-17 00:22:45     打赏
8楼

您给出的程序验证的结论是:子进程创建成功,则在子进程中返回0,父进程中返回子进程的PID.通过您给出的代码和运行结果我已经明白了.但是我还是不能解释我帖子中提到的问题.

我做vfork实验目的有两点:

1.验证vfork与fork不同,vfork是与父进程共享地址空间

2.vfork建立子进程后是子进程运行父进程阻塞

我帖子里的代码运行后的结果是count=1,count=2这点可以验证目的1,但是不明白的是为什么会出现那么多个,count=1,count=2.

验证目的2我是在您给出的代码中加了一句:

        pid = vfork();
        if(pid == 0)
        {
                printf("this is child process\n");
                while(1);
        }
这样父进程将永远停留在阻塞状态.经过运行程序也验证了目的2 .


现在两个目的好像是都验证了,但是我还是不明白在使用我帖子里的那段代码时为什么会出现那么多个,count=1,count=2. 我认为结果应该是出现一次

count=1

count=2

对于您之前说的建立子进程失败,我觉得如果失败了,也不可能会有count=1 count=2这样的结果.

是不是我哪里想错了.....



共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]