2016-11-05 10 views
0

teeを正しく使用する方法を理解しようとしています。私のアプリケーションでは、teeは何らかの理由で常にEINVALを返します。私は必死になっていて、のマニュアルページ(例:https://linux.die.net/man/2/tee)にリストされているサンプルアプリケーションを実行しようとしましたが、その例のコードでも常に失敗することがわかりました。tee: Invalid argumentたとえば、次のように使用します。cat tee.c | ./tee tee.log 。なぜこのようなことが起こるのでしょうか? die.netからティーは常にEINVALを返します

コード例は:

#define _GNU_SOURCE 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <limits.h> 

int 
main(int argc, char *argv[]) 
{ 
    int fd; 
    int len, slen; 
    if (argc != 2) { 
     fprintf(stderr, "Usage: %s <file>\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644); 
    if (fd == -1) { 
     perror("open"); 
     exit(EXIT_FAILURE); 
    } 
    do { 
     /* 
     * tee stdin to stdout. 
     */ 
     len = tee(STDIN_FILENO, STDOUT_FILENO, 
        INT_MAX, SPLICE_F_NONBLOCK); 
     if (len < 0) { 
      if (errno == EAGAIN) 
       continue; 
      perror("tee"); 
      exit(EXIT_FAILURE); 
     } else 
      if (len == 0) 
       break; 
     /* 
     * Consume stdin by splicing it to a file. 
     */ 
     while (len > 0) { 
      slen = splice(STDIN_FILENO, NULL, fd, NULL, 
          len, SPLICE_F_MOVE); 
      if (slen < 0) { 
       perror("splice"); 
       break; 
      } 
      len -= slen; 
     } 
    } while (1); 
    close(fd); 
    exit(EXIT_SUCCESS); 
} 

答えて

2

tee両方ファイル記述子、fd_infd_out配管を必要とします。

あなたの呼び出しは、2番目のファイル記述子のパイプを提供するのではなく、TTYを参照するファイル記述子を提供します。

The example below implements a basic tee(1) program using the tee() system call. 
Here is an example of its use: 

    $ date |./a.out out.log | cat 
    Tue Oct 28 10:06:00 CET 2014 
    $ cat out.log 
    Tue Oct 28 10:06:00 CET 2014 

二(又は第一、そのことについては)引数はEINVALの資格しまうため、パイプのファイル記述子を使用していない:また、マニュアルページの例では、特に末尾| catを使用することに注意してください

EINVAL fd_in or fd_out does not refer to a pipe; or fd_in and fd_out refer to 
     the same pipe. 
関連する問題