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

我想将一个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?

解决方法:

来自tee()的手册页:

tee() duplicates up to len bytes of data from the pipe referred to by
the file descriptor fd_in to the pipe referred to by the file
descriptor fd_out.

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

在你打电话给tee():

tee(fd, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);

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

STDIN_FILENO和STDOUT_FILENO不一定是管道.

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

yourProgram | cat
上一篇:Linux之在命令行下创建有名管道FIFO


下一篇:完全通过FIFO附加到MySQL客户端