unix高级环境编程(二)-------------------基础知识

来源:互联网 发布:投资返利网站源码 编辑:程序博客网 时间:2024/05/16 23:59

头文件<stdio.h>以及STDIN_FILENO和STDOUT_FILENO是POSIX标准的一部分,头文件<stdio.h>包含了很多unix系统服务的函数原型,例如read,write。

STDIN_FILENO和STDOUT_FILENO的宏定义分别是0和1,是标准输入和标准输出的文件描述符。

我们可以cc copy.c error.c

./a.out >1.txt

zhong duan xie ru wen jian

ctrl +c

cat 1.txt

可以看到我们能从终端直接写入内容到文件。。

同理 

./a.out    <1.txt   >2.txt

能将文件1.txt的内容复制到2.txt

另外read函数是阻塞的,while((n = read(0,buf,BUFFSIZE)) > 0);如果运行./a.out 不重定向标准输入,n > 0一般来说是恒成立的,阻塞等待终端写入数据,哪怕你只输入一个回车换行符。

只有read错误返回 - 1,或者read的对象是文件,到达文件末尾时,read会返回0。


另外 0 是标准输入的文件描述符,1是标准输出的文件描述符

标准I/o

为不带缓冲的I/O函数(open,read,write,lseek,close)提供了一个带缓冲的接口。标准io不用选区最佳缓冲大小,并简化了对输入行的处理。例如fgets读取一个完整的行,而read必须指定要读取的字节数,例如我们最熟悉的IO函数printf。我们知道<stdio.h>头文件包括了所有标准IO函数的原型。

例:

#include "apue.h"
int main(void)
{
    int  c;
    while((c = getc(stdin)) != EOF)
    if(putc(c,stdout) == EOF)
    {
        err_sys("output error");
    }
    if(ferror(stdin))
    {
        err_sys("input error");
    }
    exit(0);
}

这个程序的用法同上,

为什么getc这种标准输入也可以呢,因为这些都是带缓存的标准IO函数,将读到的数据先放入缓存,再有标准输出读出来,不用指定字节数。

这两种程序有什么区别呢?

首先read...没有缓存,需要自己创建缓存buf,并指定读出/写入数据的大小,而getc,gets...自带缓存,不用指定大小

其次read...传参是文件描述符,而getc,gets...传参是文件流/输入输出流,大概吧...

stdin和stdout标准输入和标准输出流。

什么是流(stream)? 什么鬼,有空再看  http://blog.csdn.net/hansnowqiang/article/details/50130437


0 0