C中的Tee函数调用不起作用并且不是tee命令

时间:2019-02-15 10:40:04

标签: c linux shell tee

嗨,我一直在用C语言编写linux shell。我想将输出重定向到文件和终端,我发现tee是可行的方法。我转到tee的linux手册页,发现tee可以用作在C程序中调用的函数调用。 所以我写了

int size =tee(pipeends[1], 1,INT_MAX,SPLICE_F_NONBLOCK);

但这根本行不通。它说

  

函数“ tee”的隐式声明   [-Wimplicit函数声明]        大小= tee(pipeends [1],1,INT_MAX,SPLICE_F_NONBLOCK);

我在互联网上进行了大量搜索,它返回的所有内容都是如何在终端中使用tee命令,而我知道这是通过使用tee来完成的。但是我想在程序中编码它,而不是让用户明确输入它。 我添加了头文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <sys/stat.h>
#include< fcntl.h>

作为我的Linux Shell代码的一部分。我不知道tee是否使用其他头文件,但我一无所知。

3 个答案:

答案 0 :(得分:4)

The manual page给出了必要的步骤:

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <fcntl.h>

这将带来一个声明,即:

ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

因此,您应该能够编写一个程序来根据该信息设置发球区域。请注意,该调用是特定于Linux的,不是标准C(也不是POSIX,Linux经常遵循的Unix标准)功能。

答案 1 :(得分:0)

似乎您的文件中没有包含正确的标题:

   #define _GNU_SOURCE         /* See feature_test_macros(7) */
   #include <fcntl.h>

您没有在问题中提及_GNU_SOURCE。也许您需要那个?

答案 2 :(得分:0)

包括以下内容:

#define _GNU_SOURCE
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);`

第三行是删除该警告的行。(它对我有用)

此外,如果要在tee之后使用splice(),请使用以下宏:

ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);

#ifndef SPLICE_F_MOVE
#define SPLICE_F_MOVE           0x01
#endif
#ifndef SPLICE_F_NONBLOCK
#define SPLICE_F_NONBLOCK       0x02
#endif
#ifndef SPLICE_F_MORE
#define SPLICE_F_MORE           0x04
#endif
#ifndef SPLICE_F_GIFT
#define SPLICE_F_GIFT           0x08
#endif

希望有帮助。我知道截止日期已经过去了:(