nhmk/示例/5-阻塞进程和线程/cat_nonblock.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;
}