可以在c编程中将fifo重定向到stdout吗?

时间:2017-08-18 08:58:33

标签: c linux pipe fifo

我想将一个fifo重定向到stdout和 我阅读了文档http://man7.org/linux/man-pages/man2/tee.2.html

它说tee(int fd_in, int fd_out,...)

但是当我向第一个参数抛出一个fifo fd时,它表示无效错误。

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
int main() {
    int num = 0, fd;
    char fifo[] = "/tmp/tmpfifo";

    fd = open(fifo, O_RDONLY, 0644);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    num = tee(fd, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
    if (num < 0) {
        perror("tee");
        exit(EXIT_FAILURE);
    }
    fprintf(stderr,"%d\n", num);
    return 0;
}

控制台显示:tee:无效参数。 第一个争论应该是stdin?

2 个答案:

答案 0 :(得分:2)

确保您的this.dateRangeForm = new FormGroup({ holidayDataControl: new FormControl(null, Validators.required) }); 是管道。

stdout

(其中rm -f /tmp/tmpfifo mkfifo /tmp/tmpfifo echo hello world > /tmp/tmpfifo & ./a.out | cat #ensure that the program's stdout is a pipe 是您的计划)适合我。

答案 1 :(得分:1)

来自tee()的手册页:

  

tee()从引用的管道复制最多len个字节的数据          文件描述符fd_in到文件引用的管道          描述符fd_out。

因此,两个文件描述符必须引用管道。

致电tee()

tee(fd, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);

fd是一个fifo,它又是一个管道,但STDOUT_FILENO可能不会引用管道。

STDIN_FILENOSTDOUT_FILENO不一定是管道。

如果希望STDOUT_FILENO引用管道,可以通过以下方式在shell的命令行运行程序:

yourProgram | cat