| 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:
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.
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);
}
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 |