LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 810|回复: 6

请教exit()的问题

[复制链接]
发表于 2005-6-8 17:11:46 | 显示全部楼层 |阅读模式
调用exit()时会把所有打开的流刷新然后关闭。但如下程序,输出却有问题。
因为调用了exit(),最后一个printf语句应该不会打印,但是它却打印出来了。
请问是什么原因?谢谢。
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>

  4. int main(void)
  5. {
  6.     int i = 1;
  7.     pid_t pid;
  8.     printf("Before vfork()\ni = %d\n", i);
  9.     pid = vfork();
  10.     if (pid == 0)
  11.     {
  12.         ++i;
  13.         exit(0);
  14.     }
  15.     printf("After vfork()\ni = %d\n", i);
  16.     return 0;
  17. }
复制代码

程序输出为:
  1. Before vfork()
  2. i = 1
  3. After vfork()
  4. i = 2
复制代码
发表于 2005-6-8 18:08:25 | 显示全部楼层
man vfork
1.vfork 产生子进程,父进程阻塞, 子进程通过EXIT返回后,父进程继续,所以会有后面的输出
2.vfork的子线程与父进程共享内存,所以 i = 2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-8 18:57:40 | 显示全部楼层
虽然父进程继续运行,但子进程通过调用exit()已经把标准输出关闭了。父进程执行printf语句时应该出错,但却没有。这就是我的疑惑。请大家帮忙分析分析。谢谢。
回复 支持 反对

使用道具 举报

发表于 2005-6-8 20:07:04 | 显示全部楼层
???虽然父进程继续运行,但子进程通过调用exit()已经把标准输出关闭了。
vfork后,子进程和父进程共享内存,但文件描述符在进程表项中, vfork后,子进程也有一个进程表项,它们之间的文件描叙符不相干。
回复 支持 反对

使用道具 举报

发表于 2005-6-8 20:58:16 | 显示全部楼层
Post by firemoth
虽然父进程继续运行,但子进程通过调用exit()已经把标准输出关闭了。父进程执行printf语句时应该出错,但却没有。这就是我的疑惑。请大家帮忙分析分析。谢谢。

文件的引用计数要减到零,内核才会把它真正关闭。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-9 08:56:20 | 显示全部楼层
Post by JBug
???虽然父进程继续运行,但子进程通过调用exit()已经把标准输出关闭了。
vfork后,子进程和父进程共享内存,但文件描述符在进程表项中, vfork后,子进程也有一个进程表项,它们之间的文件描叙符不相干。

我想它们应该是共享文件的吧。因为如果把上面的程序的输出重定向到一个文件中,子进程的输出也会写到该文件中。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-9 09:14:04 | 显示全部楼层
Post by kj501
文件的引用计数要减到零,内核才会把它真正关闭。

有道理。我试过把子进程执行语句中的
  1. exit(0);
复制代码

之前加上
  1. close(1);
复制代码

结果也不能关闭标准输出。我想就是这个原因吧。谢谢。
回复 支持 反对

使用道具 举报

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

本版积分规则

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