打印fifo内容并退出

我需要将fifo(命名pipe道)的内容打印到标准输出。
我可以使用这个命令:

cat fifo 

问题是, cat不会返回。 它一直在运行,等待来自fifo的更多内容。 但是我知道那里不会有更多的内容来一段时间,所以我只是想打印什么可用。

有没有一个命令,只是打印可用的内容并退出?

编辑:
在fifo的一端,有一个过程不时地写出不同命令的输出。 该过程永久运行,所以不会是一个EOF。

当您无法发送EOF时,您可以使用“无阻塞的猫”。 我已经包括了一个我在这里找到的(测试过的)C版本(当然,这个版本在那里是原作者)。 魔法是在fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK).

这个非阻塞猫的第一个参数是在退出之前要等待的秒数。

 #include <stdio.h> #include <fcntl.h> #include <time.h> #include <unistd.h> #include <string.h> void read_loop(int fFile, double wWait) { if (fFile < 0) return; double max_time = wWait, total_time = 0; struct timespec cycle_time = { 0, 50 * 1000 * 1000 }; double add_time = (double) cycle_time.tv_sec + (double) cycle_time.tv_nsec / 1000000000.; char next_line[1024]; FILE *input_file = fdopen(fFile, "r"); while (total_time < max_time) { while (fgets(next_line, 1024, input_file)) { write(STDOUT_FILENO, next_line, strlen(next_line)); total_time = 0; } nanosleep(&cycle_time, NULL); total_time += add_time; } fclose(input_file); } int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "%s [max time] (files...)\n", argv[0]); return 1; } int max_wait = strtoul(argv[1],0, 10); if (argc == 2) { fprintf(stderr, "%s: using standard input\n", argv[0]); fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); read_loop(STDIN_FILENO, max_wait); return 0; } int current = 2; while (current < argc) { fprintf(stderr, "%s: switch to file '%s'\n", argv[0], argv[current]); int next_file = open(argv[current++], O_RDONLY | O_NONBLOCK); read_loop(next_file, max_wait); close(next_file); } return 0; } 

您应该关闭FIFO的另一端。 这应该发送一个EOF到cat进程。