Scroll to navigation

tee(2) System Calls Manual tee(2)

الاسم

tee - مضاعفة محتوى الأنبوب

المكتبة

مكتبة سي المعيارية (libc، -lc)

موجز

#define _GNU_SOURCE         /* انظر feature_test_macros(7) */
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t size, unsigned int flags);

الوصف

تضاعف tee() حتى size بايت من البيانات من الأنبوب المشار إليه بواصف الملف fd_in إلى الأنبوب المشار إليه بواصف الملف fd_out. لا تستهلك البيانات المكررة من fd_in؛ لذلك، يمكن نسخ تلك البيانات بواسطة splice(2) لاحق.

flags قناع بت يتكون من جمع (OR) صفر أو أكثر من القيم التالية:

ليس له تأثير حالياً على tee()؛ انظر splice(2).
لا تعيق الإدخال/الإخراج؛ انظر splice(2) لمزيد من التفاصيل.
ليس له تأثير حالياً على tee()، لكن قد يُنفذ في المستقبل؛ انظر splice(2).
غير مستخدم لـ tee()؛ انظر vmsplice(2).

قيمة الإرجاع

عند الإكمال بنجاح، ترجع tee() عدد البايتات التي تم تكرارها بين الإدخال والإخراج. قيمة الإرجاع 0 تعني عدم وجود بيانات للنقل، ولا معنى للحظر، لعدم وجود كتّاب متصلين بنهاية الكتابة للأنبوب المشار إليه بـ fd_in.

عند الخطأ، ترجع tee() -1 ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

حُدد SPLICE_F_NONBLOCK في flags أو وُسم أحد واصفات الملفات على أنه غير مانع (O_NONBLOCK)، وكانت العملية ستمنع.
fd_in أو fd_out لا يشير إلى أنبوب؛ أو fd_in و fd_out يشيران إلى نفس الأنبوب.
نفدت الذاكرة.

المعايير

لينكس.

التاريخ

لينكس 2.6.17، glibc 2.5.

ملاحظات

مفاهيمياً، تنسخ tee() البيانات بين الأنبوبين. في الواقع لا يحدث نسخ حقيقي للبيانات: تحت الغطاء، تُسند tee() البيانات إلى الإخراج بمجرد أخذ مرجع إلى الإدخال.

أمثلة

المثال أدناه ينفذ برنامج tee(1) أساسي باستخدام استدعاء النظام tee(). إليك مثال لاستخدامه:


$ 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 size, ssize;
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);
}
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;
/*
* Consume stdin by splicing it to a file.
*/
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); }

انظر أيضًا

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

ترجمة

تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.

8 فبراير 2026 صفحات دليل لينكس 6.18