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

5.1 用setvbuf实现setbuf

C语言setbuf()函数:把缓冲区与流相关联

C语言setvbuf()函数:设置文件流的缓冲区

/*************************************************************************
    > File Name: test12_1.c
    > Author: King
    > Mail: [email protected] 
    > 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 
int
main(void)
{
    char c;
    while ((c = getchar()) != EOF)
        putchar(c);
}
因为getchar返回的是int型值,而char是无符号数,int转换为无符号数与EOF,值为-1相比较,永远不会相等,该程序形成死循环。

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

功能描述: 
系统调用fsync将所有已写入文件描述符fd的数据真正的写道磁盘或者其他下层设备上。

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

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

标准输入和标准输出均为行缓冲方式,fgetc每次调用stdin均会冲洗缓冲区。

 

你可能感兴趣的:(UNIX,UNIX,unix,c语言)