- 论坛徽章:
- 0
|
回复 5# ooaoodoop1
那个说法和例子确实搞错了。
刚刚试了下, fd 0 , 1 , 2 不vfork_exit也不会关闭,这点不用怀疑。
我发现vfork如果结束时调用exit(), 那么缓冲方式就会改变。
(好像就是内部缓存为0了,不管用setvbuf(stdout , 0 , _IOLBF , 0)还是setvbuf(stdout , 0 , _IOFBF , 0)怎么设置都没用了。)
但是如果使用自己的缓存空间设置就可以 。 setvbuf(stdout , buff , _IOLBF , sizeof(buff))
所以我觉得这个现象是由于××标准IO库××的实现有关。。。。 vfork在exit后,使得标准IO对stdout的缓存方式变成了无缓存的样子了,并且无论怎么设置都无法使得里面的自带的缓存机制工作了。。
看这个例子如下:
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
int glob = 6; /* external variable in initialized data */
char buff[1024];
int
main(void)
{
int var; /* automatic variable on the stack */
pid_t pid;
int ret;
var = 88;
printf("before vfork\n"); /* we don't flush stdio */
if ((pid = vfork()) < 0) {
printf("vfork error");
} else if (pid == 0) { /* child */
glob++; /* modify parent's variables */
var++;
exit(0); /* child terminates */
}
/*
* Parent continues here.
*/
/*以下三句三选一,然后看结果。*/
ret = setvbuf(stdout , buff , _IOLBF , sizeof(buff)); //使用这句时,就无输出了。以下两句都还是有输出。但设置函数并没出错!
//ret = setvbuf(stdout , 0 , _IOFBF , 0);
//ret = setvbuf(stdout, NULL , _IOLBF, 0);
if(ret != 0)
pause();//这里用pause,以免引起混乱。
printf("pid = %d, glob = %d, var = %d", getpid(), glob, var); //你可以加上\n验证下是不是我说的情况。
_exit(0);
}
应该就是这种情况了。 |
|