2016-11-05 4 views
0

Ich versuche herauszufinden, wie man richtig verwendet tee. In meiner Anwendung gibt tee aus irgendeinem Grund immer EINVAL zurück. Ich wurde verzweifelt und versuchte, die Beispielanwendung auszuführen, die auf der Manpage von tee aufgeführt ist (zum Beispiel: https://linux.die.net/man/2/tee), nur um herauszufinden, dass auch dieser Beispielcode immer fehlschlägt mit: tee: Invalid argument, zum Beispiel wenn er wie folgt verwendet wird: cat tee.c | ./tee tee.log . Irgendeine Idee, warum das passieren könnte?Tee immer zurück EINVAL

Der Beispielcode aus die.net:

#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); 
} 

Antwort

2

tee erfordert ein Rohr für beide Datei-Deskriptoren, und fd_infd_out.

Ihr Aufruf liefert keine Pipe für den zweiten Dateideskriptor, sondern einen Dateideskriptor, der sich auf ein TTY bezieht. Beachten Sie auch, dass das Beispiel in der -Manpage ein spezifisch verwendet nachlauf | cat:

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 

nicht ein Rohr Dateideskriptor für die zweite (oder erste, was das betrifft) argument qualifizieren würde für EINVAL:

EINVAL fd_in or fd_out does not refer to a pipe; or fd_in and fd_out refer to 
     the same pipe.