8.1 在图8-3 程序中,如果exit调用替代_exit调用,那么可能会使标准输出关闭,使printf返回-1.修改该程序以验证你所使用的系统上是否会产生这种错误。如果并非如此,你怎样处理才能得到类似结果呢?
为了方针子进程终止时关闭标准输出的行为,在调用exit之前加入下列代码行:
fclose(stdout);
/*************************************************************************
> File Name: ins8_3.c
> Author: Elliot
************************************************************************/
#include "apue.h"
int globvar = 6; /* external variable in initialized data */
#define SIZE 256
int
main(void)
{
int var; /* automatic variable on the stack */
pid_t pid;
int i;
char buf[SIZE];
var = 88;
printf("before vfork\n"); /* we don't flush stdio */
if ((pid = vfork()) < 0)
err_sys("vfork error");
else if(pid == 0)
{
globvar++; /* child */
var++; /* modify parent's variables */
fclose(stdout);
exit(0);
}
/* parent continue here */
i = printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar,
var);
sprintf(buf, "%d\n", i);
write(STDOUT_FILENO, buf, strlen(buf));
exit(0);
}
这里假设子进程调用exit函数时关闭标准I/O流,但不关闭文件描述符 STDOUT_FILENO。有些版本的标准I/O库会关闭与标准输出相关联的文件描述符从而引起write标准输出失败。着这种情况下,调用dup将标准输出复制到另一个描述符,write则使用新复制的文件描述符。
8.2 回忆图7-6中典型的存储空间布局。由于对应于每个函数调用的栈帧通常存储在栈中,并且由于调用vfork后,子进程运行在父进程的地址空间中,如果不是在main函数中而是在另一个函数中调用vfork,伺候子进程又从该函数返回,会发生什么?请编写一段测试程序对此验证。
/**********