tee(2)

NUME
tee - duplică conținutul conductelor

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#define _GNU_SOURCE         /* Consultați feature_test_macros(7) */
#include <fcntl.h>

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

DESCRIERE
tee() duplică până la size 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:

SPLICE_F_MOVE
    În prezent nu are efect pentru tee(); a se vedea splice(2).

SPLICE_F_NONBLOCK
    Nu blochează operațiile de In/Ieș; a se vedea splice(2) pentru mai multe detalii.

SPLICE_F_MORE
    Currently has no effect for tee(), but may be implemented in the future; see splice(2).

SPLICE_F_GIFT
    Neutilizat pentru tee(); a se vedea vmsplice(2).

VALOAREA RETURNATĂ
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.

ERORI-IEȘIRE

EAGAIN
    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.

EINVAL
    fd_in sau fd_out nu se referă la o conductă; sau fd_in și fd_out se referă la aceeași conductă.

ENOMEM
    Memorie insuficientă.

STANDARDE
Linux.

ISTORIC
Linux 2.6.17, glibc 2.5.

NOTE
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.

EXEMPLE
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

  Sursa programului
    #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  size, ssize;

        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 to stdout.
             */
            size = tee(STDIN_FILENO, STDOUT_FILENO,
                      INT_MAX, SPLICE_F_NONBLOCK);
            if (size < 0) {
                if (errno == EAGAIN)
                    continue;
                perror("tee");
                exit(EXIT_FAILURE);
            }
            if (size == 0)
                break;

            /*
             * Consumă „stdin” prin introducerea acesteia într-un fișier.
             */
            while (size > 0) {
                ssize = splice(STDIN_FILENO, NULL, fd, NULL,
                              size, SPLICE_F_MOVE);
                if (ssize < 0) {
                    perror("splice");
                    exit(EXIT_FAILURE);
                }
                size -= ssize;
            }
        }

        close(fd);
        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
splice(2), vmsplice(2), pipe(7)

TRADUCERE
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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.