打印fifo内容并退出

Posted

技术标签:

【中文标题】打印fifo内容并退出【英文标题】:Print fifo content and exit 【发布时间】:2009-05-14 21:04:45 【问题描述】:

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

cat fifo

问题是cat 没有返回。它保持运行,等待来自 fifo 的更多内容。但我知道暂时不会有更多内容了,所以我只想打印可用的内容。

是否有只打印可用内容并退出的命令??

编辑: 在 fifo 的一端,有一个进程不时地写入不同命令的输出。该进程将永久运行,因此不会出现 EOF。

【问题讨论】:

【参考方案1】:

当您无法发送 EOF 时,您可以使用“非阻塞猫”。我已经包含了一个(测试过的)C 版本,我找到了here(当然要归功于那里的原作者)。魔法就在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;

【讨论】:

没想到会到这个地步。我希望有一个内置的 Linux 命令。无论如何,我已经在使用这个“非阻塞猫”了。不过我改变了一点;我不喜欢浮点算术,所以我将其更改为整数算术,并且我还将时间参数更改为接受毫秒。谢谢。【参考方案2】:

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

【讨论】:

我知道,但这正是问题所在。永远不会有 EOF,因为另一端的进程会每隔一段时间继续发送数据。

以上是关于打印fifo内容并退出的主要内容,如果未能解决你的问题,请参考以下文章

循环向量退出并出现错误进程以退出代码 -1073741819 完成

Perl 内置退出并在一个命令中打印

Zebra 标签打印机 TLP 2824 Plus 打印 2 个标签并退出

如果用户的 PC 没有安装打印机,为啥 Delphi 7 应用程序会以“遇到问题并需要关闭”而退出?

为啥我的链表内容在退出函数时会消失?

pytest打印语​​句仅在退出()之前发出时才有效[重复]