tee(2) System Calls Manual tee(2)

tee - duplică conținutul conductelor

Biblioteca C standard (libc, -lc)

#define _GNU_SOURCE         /* Consultați feature_test_macros(7) */
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

tee() duplică până la len octeți de date din conducta la care se referă descriptorul de fișier fd_in în conducta la care se referă descriptorul de fișier fd_out. Nu consumă datele care sunt duplicate din fd_in; prin urmare, datele respective pot fi copiate de un splice(2) subsecvent.

flags este o mască de biți care se compune prin combinarea prin OR împreună cu zero sau mai multe dintre următoarele valori:

În prezent nu are efect pentru tee(); a se vedea splice(2).
Nu blochează operațiile de In/Ieș; a se vedea splice(2) pentru mai multe detalii.
Currently has no effect for tee(), but may be implemented in the future; see splice(2).
Neutilizat pentru tee(); a se vedea vmsplice(2).

La finalizarea cu succes, tee() returnează numărul de octeți care au fost duplicați între intrare și ieșire. O valoare de returnare 0 înseamnă că nu a existat nici un transfer de date și nu ar avea sens să se blocheze, deoarece nu există scriitori conectați la capătul de scriere al conductei la care face referire fd_in.

În caz de eroare, tee() returnează -1, iar errno este configurată pentru a indica eroarea.

SPLICE_F_NONBLOCK a fost specificat în fanioane sau unul dintre descriptorii de fișiere a fost marcat ca neblocant (O_NONBLOCK), și operația s-ar putea bloca.
fd_in sau fd_out nu se referă la o conductă; sau fd_in și fd_out se referă la aceeași conductă.
Memorie insuficientă.

Linux.

Linux 2.6.17, glibc 2.5.

Din punct de vedere conceptual, tee() copiază datele între cele două conducte. În realitate, nu are loc nicio copiere reală de date: sub acoperire, tee() atribuie date la ieșire prin simpla preluare a unei referințe la intrare.

Exemplul de mai jos implementează un program de bază tee(1) utilizând apelul de sistem tee(). Iată un exemplu de utilizare a acestuia:


$ 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

#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
    int      fd;
    ssize_t  len, slen;
    if (argc != 2) {
        fprintf(stderr, "Utilizare: %s <fișier>\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);
    }
    for (;;) {
        /*
         * tee „stdin” la „stdout”.
         */
        len = tee(STDIN_FILENO, STDOUT_FILENO,
                  INT_MAX, SPLICE_F_NONBLOCK);
        if (len < 0) {
            if (errno == EAGAIN)
                continue;
            perror("tee");
            exit(EXIT_FAILURE);
        }
        if (len == 0)
            break;
        /*
         * Consumă „stdin” prin introducerea acesteia într-un fișier.
         */
        while (len > 0) {
            slen = splice(STDIN_FILENO, NULL, fd, NULL,
                          len, SPLICE_F_MOVE);
            if (slen < 0) {
                perror("splice");
                exit(EXIT_FAILURE);
            }
            len -= slen;
        }
    }
    close(fd);
    exit(EXIT_SUCCESS);
}

splice(2), vmsplice(2), pipe(7)

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

15 iunie 2024 Pagini de manual de Linux 6.9.1