table of contents
tee(2) | System Calls Manual | 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 len, unsigned int flags);
DESCRIERE¶
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:
- 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¶
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 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); }
CONSULTAȚI ȘI¶
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 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.
2 mai 2024 | Pagini de manual Linux (nepublicate) |