QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1217|回复: 2

vfork子进程调用exit后的退出问题??

[复制链接]
发表于 2005-12-12 21:05:55 | 显示全部楼层 |阅读模式
代码:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int glob = 6;

int main()
{
   int var;
   pid_t pid;
  
   var = 88;

   printf("before vfork\n");

   if((pid = vfork()) < 0){
       printf("vfork error\n"0;
   }else if(pid == 0){
       glob++;
       var++;
       _exit(0);  //问题?? 换成exit(0),输出??
    }


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

    exit(EXIT_SUCCESS);
}

就是unix环境编程的问题,书上说如果把_exit(0), 换作exit(0),将会只输出:
before vfork
原因是子进程调用了exit,它刷新关闭了所有的标准I/0流,所以父进程调用printf时,输出流已关闭,于是printf返回-1

可我运行不是,printf照样输出,返回值是32,请问各位是什么原因呢??
发表于 2005-12-13 00:43:00 | 显示全部楼层
呵呵,我和朋友正好研究过这个问题。。甚至简单如[code:1]int main(){vfork();}[/code:1]在 Linux 2.6 内核(FC4)上都会直接造成 segmentation fault。简单分析是,exit 会尝试关闭 stdin 等FILE*,调用 atexit 回调;由于 vfork 得到的子进程运行在父进程地址空间中,子进程结束(退出或 exec)后父进程才会继续执行,得到的结果就是在同一个地址空间中执行了两次 exit,所有 FILE * 被关闭了两遍,清理工作也执行了两遍,因此出错。
回复

使用道具 举报

 楼主| 发表于 2005-12-13 09:09:22 | 显示全部楼层
我的意识是并不是出错,既然子进程是在父进程地址空间中运行,子进程调用exit退出后就关闭了stdout,那么按理说父进程调用printf输出应该会出错啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 02:31 , Processed in 0.136904 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表