在POSIX标准中提供了函数open, read, write, lseek以及close提供不带缓冲的IO,这些函数都是使用文件描述符;
在Linux/Unix系统中将标准输入复制到标准输出简单实现如下:
#include <unistd.h> #define BUFFSIZE 4096 int main(int argc, char **argv) { 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); }
解析:
头文件#include <unistd.h>和两个常量STDIN_FILENO, STDOUT_FILENO是POSIX标准的一部分,头文件#include <unistd.h>中包含了很多Unix系统服务的函数原型(如本例中的read和write);
两个常量STDIN_FILENO和STDOUT_FILENO定义在该头文件中,他们指定了标准输入和标准输出的文件描述符,在POSIX标准中他们的值分别是0和1.
read函数返回读取的字节数,此值用作要写的字节数。当到达输入文件的尾端时,read返回0,程序停止执行。如果发生了错误,read返回-1;
相比之下,标准I/O实现相同的功能,代码:
#include <unistd.h> int main(int argc, char **argv) { char 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一次读取一个字符,然后函数putc将此字符写到标准输出。读到输入的最后一个字节时,getc返回常量EOF(该常量在头文件#include <stdio.h>中定义)。标准I/O也在改头文件中定义,他们分别表示标准输入和标准输出;
时间: 2024-10-14 20:37:02