UNIX环境高级编程习题——第八章

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,伺候子进程又从该函数返回,会发生什么?请编写一段测试程序对此验证。

/**********
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值