免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1778 | 回复: 2
打印 上一主题 下一主题

关于fork()与vfork()的两个实例的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-19 11:50 |只看该作者 |倒序浏览
fork():

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

int main()
{
        int var;
        pid_t pid;

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

        if( (pid = fork()) < 0 ) {
                err_sys("fork error");
        } else if(pid == 0) {
                glob++;
                var++;
        } else {
                sleep(2);
        }

        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
        exit(0);
}
输出如下:
[root@www apue2]# ./a.out
a write to stdout
before fork
pid = 26062, glob = 7, var = 89
pid = 26060, glob = 6, var = 88



vfork():

int glob = 6;

int main()
{
        int var;
        pid_t pid;

        var = 88;
        printf("before fork\n");

        if( (pid = vfork()) < 0 ) {
                err_sys("fork error");
        } else if(pid == 0) {
                glob++;
                var++;
                _exit(0);                       //不是exit(0)
        }
       
        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
        exit(0);       
}
输出如下:
[root@www apue2]# ./a.out
before fork
pid = 27042, glob = 7, var = 89



我的疑问是: vfork()的输出应该是:
before fork
pid = 27043, glob = 7, var = 89         //vfork()保证子进程先运行
pid = 27042, glob = 7, var = 89         //在子进程调用exec或exit之前,它在父进程的地址空间运行

但,为什么vfork()输出却只有一行,而不是像fork()那样是两行?

[ 本帖最后由 李某人 于 2009-4-19 15:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-19 14:35 |只看该作者
你的vfor子进程里面的exit,让它走不到最下面的输出了!

论坛徽章:
0
3 [报告]
发表于 2009-04-20 09:18 |只看该作者
The vfork() function shall be equivalent to fork(), except that the behavior is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit() or one of the exec family of functions.

Conforming applications are recommended not to depend on vfork(), but to use fork() instead. The vfork() function may be withdrawn in a future version.

On some implementations, vfork() is equivalent to fork().

引自The Open Group Base Specifications Issue 6


然后是关于你的问题,子进程在输出之前已经调用_exit退出了,所以只有父进程执行了输出语句

[ 本帖最后由 雨过白鹭洲 于 2009-4-20 09:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP