《UNIX环境高级编程(第3版)》——1.5 输入和输出

简介: 函数getc一次读取一个字符,然后函数putc将此字符写到标准输出。读到输入的最后一个字节时,getc返回常量EOF(该常量在中定义)。标准I/O常量stdin和stdout也在头文件中定义,它们分别表示标准输入和标准输出。

本节书摘来自异步社区《UNIX环境高级编程(第3版)》一书中的第1章,第1.5节,作者:【美】W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.5 输入和输出

1.文件描述符
文件描述符(file descriptor)通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这个文件描述符。

2.标准输入、标准输出和标准错误
按惯例,每当运行一个新程序时,所有的shell都为其打开3个文件描述符,即标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。如果不做特殊处理,例如就像简单的命令ls,则这3个描述符都链接向终端。大多数shell都提供一种方法,使其中任何一个或所有这3个描述符都能重新定向到某个文件,例如:

ls > file.list
执行ls命令,其标准输出重新定向到名为file.list的文件。

3.不带缓冲的I/O
函数open、read、write、lseek以及close提供了不带缓冲的I/O。这些函数都使用文件描述符。

实例
如果愿意从标准输入读,并向标准输出写,则图1-4中所示的程序可用于复制任一UNIX普通文件。

#include "apue.h"

#define  BUFFSIZE  4096

int
main(void) 
{
   int   n; 
   char  buf[BUFFSIZE]; 

   while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) 
     if (write(STDOUT_FILENO, buf, n) != n) 
        err_sys("write error");

   if (n < 0) 
     err_sys("read error");

   exit(0); 
}

图1-4 将标准输入复制到标准输出

头文件(apue.h中包含了此头文件)及两个常量STDIN_FILENO和STDOUT_FILENO是POSIX标准的一部分(下一章将对此做更多的说明)。头文件包含了很多UNIX系统服务的函数原型,例如图1-4程序中调用的read和write。

两个常量STDIN_FILENO和STDOUT_FILENO定义在头文件中,它们指定了标准输入和标准输出的文件描述符。在POSIX标准中,它们的值分别是0和1,但是考虑到可读性,我们将使用这些名字来表示这些常量。

3.9节将详细讨论BUFFSIZE常量,说明它的各种不同值将如何影响程序的效率。但是不管该常量的值如何,此程序总能复制任一UNIX普通文件。

read函数返回读取的字节数,此值用作要写的字节数。当到达输入文件的尾端时,read返回0,程序停止执行。如果发生了一个读错误,read返回−1。出错时大多数系统函数返回−1。

如果将该程序编译成标准名称的a.out文件,并以下列方式执行它:

./a.out > data
那么标准输入是终端,标准输出则重新定向至文件data,标准错误也是终端。如果此输出文件并不存在,则shell会创建它。该程序将用户键入的各行复制到标准输出,键入文件结束符(通常是Ctrl+D)时,将终止本次复制。

若以下列方式执行该程序:

./a.out < infile > outfile
会将名为infile文件的内容复制到名为outfile的文件中。

4.标准I/O
标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无需担心如何选取最佳的缓冲区大小,如图1-4中的BUFFSIZE常量的大小。使用标准I/O函数还简化了对输入行的处理(常常发生在UNIX的应用程序中)。例如,fgets函数读取一个完整的行,而read函数读取指定字节数。在5.4节中我们将了解到,标准I/O函数库提供了使我们能够控制该库所使用的缓冲风格的函数。

我们最熟悉的标准I/O函数是printf。在调用printf的程序中,总是包含(在本书中,该头文件包含在apue.h中),该头文件包括了所有标准I/O函数的原型。

实例
图1-5程序的功能类似于前一个调用了read和write的程序,5.8节将对此程序进行更详细的说明。它将标准输入复制到标准输出,也就能复制任一UNIX普通文件。

#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); 
}

图1-5 用标准I/O将标准输入复制到标准输出

函数getc一次读取一个字符,然后函数putc将此字符写到标准输出。读到输入的最后一个字节时,getc返回常量EOF(该常量在中定义)。标准I/O常量stdin和stdout也在头文件中定义,它们分别表示标准输入和标准输出。

相关文章
|
9月前
|
Unix Linux C语言
计算机操作系统实验一 Unix/Linux编程开发环境
计算机操作系统实验一 Unix/Linux编程开发环境
95 0
|
5月前
|
Unix Shell Python
unix高级编程-fork和execve
unix高级编程-fork和execve
26 0
|
5月前
|
Ubuntu Unix Shell
unix高级编程-fork之后父子进程共享文件
unix高级编程-fork之后父子进程共享文件
34 0
|
5月前
|
Unix Linux
unix高级编程-僵尸进程和孤儿进程
unix高级编程-僵尸进程和孤儿进程
37 0
|
11月前
|
Unix Linux Shell
Unix/Linux环境使用(基础篇)(五)
Unix/Linux环境使用(基础篇)(五)
|
11月前
|
网络协议 安全 Ubuntu
Unix/Linux环境使用(基础篇)(四)
Unix/Linux环境使用(基础篇)(四)
|
11月前
|
Ubuntu Unix Linux
Unix/Linux环境使用(基础篇)(三)
Unix/Linux环境使用(基础篇)(三)
|
11月前
|
安全 Unix Linux
Unix/Linux环境使用(基础篇)(二)
Unix/Linux环境使用(基础篇)(二)
|
11月前
|
Ubuntu 安全 NoSQL
Unix/Linux环境使用(基础篇)(一)
Unix/Linux环境使用(基础篇)(一)