60 lines
1.6 KiB
C
60 lines
1.6 KiB
C
/*
|
|
* cat_nonblock.c - 打开一个文件并显示其内容,但不等待输入而是直接退出。
|
|
*/
|
|
#include <errno.h> /* 用于 errno */
|
|
#include <fcntl.h> /* 用于 open */
|
|
#include <stdio.h> /* 标准 I/O */
|
|
#include <stdlib.h> /* 用于 exit */
|
|
#include <unistd.h> /* 用于 read */
|
|
|
|
#define MAX_BYTES 1024 * 4 /* 最大读取字节数 */
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int fd; /* 要读取的文件的文件描述符 */
|
|
size_t bytes; /* 读取的字节数 */
|
|
char buffer[MAX_BYTES]; /* 存储读取字节的缓冲区 */
|
|
|
|
/* 用法说明 */
|
|
if (argc != 2) {
|
|
printf("用法: %s <文件名>\n", argv[0]);
|
|
puts("读取文件的内容,但不等待输入");
|
|
exit(-1);
|
|
}
|
|
|
|
/* 以非阻塞模式打开文件 */
|
|
fd = open(argv[1], O_RDONLY | O_NONBLOCK);
|
|
|
|
/* 如果打开失败 */
|
|
if (fd == -1) {
|
|
puts(errno == EAGAIN ? "打开会阻塞" : "打开失败");
|
|
exit(-1);
|
|
}
|
|
|
|
/* 读取文件并输出其内容 */
|
|
do {
|
|
/* 从文件中读取字符 */
|
|
bytes = read(fd, buffer, MAX_BYTES);
|
|
|
|
/* 如果发生错误,报告错误并退出 */
|
|
if (bytes == -1) {
|
|
if (errno == EAGAIN)
|
|
puts("正常情况下会阻塞,但你告诉我不阻塞");
|
|
else
|
|
puts("读取错误");
|
|
exit(-1);
|
|
}
|
|
|
|
/* 打印读取的字符 */
|
|
if (bytes > 0) {
|
|
for (int i = 0; i < bytes; i++)
|
|
putchar(buffer[i]);
|
|
}
|
|
|
|
/* 当没有错误且文件未结束时继续 */
|
|
} while (bytes > 0);
|
|
|
|
return 0;
|
|
}
|
|
|