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

5.1 用setvbuf实现setbuf

/*************************************************************************
    > File Name: test12_1.c
    > Author: King
    > Mail: arturiapendragon_1@163.com 
    > Created Time: 2017年08月21日 星期一 07时32分01秒
 ************************************************************************/

/*
 * 用setvbuf实现setbuf
 */

#include "apue.h"

void
setbuf(FILE *fp, char *restrict_buf)
{
    if (restrict_buf == NULL)
    {
        setvbuf(fp, restrict_buf, _IONBF, 0);
        printf("No buf");
    }
    else
    {
        if (fp == stdin)
        {

            if (setvbuf(fp, restrict_buf, _IOLBF, BUFSIZ) != 0)
            {
                err_sys("setvbuf error");
                exit(-1);
            }
        }
        else if(fp == stdout)
        {
            if (setvbuf(fp, restrict_buf, _IOLBF, BUFSIZ) != 0)
            {
                err_sys("setvbuf error");
                exit(-1);
            }
        }
        else if(fp == stderr)
        {
            if (setvbuf(fp, restrict_buf, _IOLBF, BUFSIZ) != 0)
            {
                err_sys("setvbuf error");
                exit(-1);
            }
        }
        else
        {
            if (setvbuf(fp, restrict_buf, _IOFBF, BUFSIZ) != 0)
            {
                err_sys("setvbuf error");
                exit(-1);
            }

        }
    printf("Line buf");
    }
}

5.2 图5-5中的程序利用每次一行I/O(fgets和fputs函数)复制文件。若将程序中的MAXLINE改为4,当复制的行超过该最大值时会出现什么情况。对此进行解释。

fgets函数读入数据,直到行结束或缓冲区满(当然会留出一个字节存放终止null字节)。同样fputs只负责将缓冲区的内容输出直到遇到null字节,而并不考虑缓冲区是否包含换行符。所以,如果MAXLINE设得很小,这两个函数仍正常工作,只不过缓冲区较大时,函数被执行的次数要多于MAXLINE值设置得较大的时候。

5.3 printf返回0值表示什么

没有输出字符,即printf("");

5.4 下面的代码在已写机器上运行正确,而在另一些机器运行时出错,解释问题所在。

#include <stdio.h>
int
main(void)
{
    char c;
    while ((c = getchar()) != EOF)
        putchar(c);
}
因为getchar返回的是int型值,而char是无符号数,int转换为无符号数与EOF,值为-1相比较,永远不会相等,该程序形成死循环。

5.5 对标准I/O流如何使用fsync函数?

使用方法,先调用fflush后调用fsync(保证文件系统与缓冲区内容的一致性)。fsync所使用的参数由fileno函数获得。如果不调用fflush,所有的数据仍然在内存缓冲区中,此时调用fsync将没有任何效果。

5.6 在图1-7和图1-10程序中,打印的提示纤细没有包含换行符,程序也没有调用fflush函数,请解释输出提示信息的原因是什么?

标准输入和标准输出均为行缓冲方式,fgetc每次调用stdin均会冲洗缓冲区。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的第2版。在   本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变   化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技   术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程   关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在   此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附   录中给出了函数原型和部分习题的答案。   本书内容权威,概念清晰,阐述精辟,对于所有层次UNIX/Linux程序员都是一本不可或缺的参考书。 *************************************************************** 请注意: 下载完,评论的同时,请点击评论框上方的五角星(共5个五角星),这样你的被扣的积分就可以返还了。 如果只评论,不点击小五角星,积分不会返还。 一定要先下载完,再评论。如果先评论后下载,或者在下载的过程中评论,积分同样不会返还。 *************************************************************** 更多linux、ARM和C语言资源请参考: http://blog.csdn.net/arkofnoach/archive/2010/10/23/5960560.aspx

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值