/* * cat_nonblock.c - 打开一个文件并显示其内容,但不等待输入而是直接退出。 */ #include /* 用于 errno */ #include /* 用于 open */ #include /* 标准 I/O */ #include /* 用于 exit */ #include /* 用于 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; }