الأنابيب
الاتصال بين الأصل والفرع
الأنابيب درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
ما هي القناة
القناة هي قناة اتصال أحادية الاتجاه بين عمليات مترابطة. تكتب إحدى العمليات البايتات فيها، وتقرأها عملية أخرى، مثل حزام ناقل للبيانات.
واصفا ملفات
يملأ الاستدعاء pipe() مصفوفة من عنصرين: يمثّل fd[0] طرف القراءة، ويمثّل fd[1] طرف الكتابة. ويمكن قراءة البيانات المكتوبة إلى fd[1] من fd[0].
#include <unistd.h>
#include <stdio.h>
int make_pipe(int fd[2]) {
if (pipe(fd) < 0) { perror("pipe"); return -1; }
/* fd[0] read end, fd[1] write end */
return 0;
}الدمج مع fork
بعد تنفيذ fork()، تشترك العملية الأب والعملية الابن في واصفات القناة. بهذه الطريقة تتواصل العملية الأب والعملية الابن: تكتب إحداهما وتقرأ الأخرى.
إغلاق الأطراف غير المستخدمة
ينبغي لكل عملية أن تغلق الطرف الذي لا تستخدمه. تغلق القارئة طرف الكتابة، ويغلق الكاتب طرف القراءة. وإلا فلن يرى القارئ نهاية الملف مطلقًا.
#include <unistd.h>
void parent_as_writer(int fd[2]) {
close(fd[0]); /* parent will not read */
write(fd[1], "hello", 5); /* parent writes */
close(fd[1]); /* signal EOF to reader */
}مثال على عملية أب وابن
تكتب العملية الأب رسالة، وتقرأها العملية الابن. وتغلق كل منهما الطرف الذي لا تحتاج إليه.
#include <unistd.h>
#include <stdio.h>
void demo(int fd[2]) {
if (fork() == 0) { /* child: reader */
close(fd[1]);
char buf[64];
ssize_t n = read(fd[0], buf, sizeof buf - 1);
buf[n] = 0;
printf("child got: %s\n", buf);
close(fd[0]);
} else { /* parent: writer */
close(fd[0]);
write(fd[1], "hi child", 8);
close(fd[1]);
}
}إرجاع القراءة EOF
عند إغلاق جميع أطراف الكتابة، يعيد read القيمة 0، مشيرًا إلى نهاية الملف. وإذا ظل أحد أطراف الكتابة مفتوحًا، فستحجب القراءة التنفيذ منتظرةً المزيد من البيانات إلى الأبد، وهذا خطأ شائع.
سعة القناة والحجب
للقناة مخزن مؤقت محدود (غالبًا 64 KB). فإذا امتلأ، يحجب write التنفيذ حتى يفرّغ قارئٌ بعض محتواه. وإذا كان فارغًا، تحجب read التنفيذ حتى وصول البيانات. وتزامن آلية التحكم في التدفق هذه بين العمليتين.
إعادة التوجيه باستخدام dup2
يمكن لـ dup2 استبدال stdin أو stdout الخاص بالعملية بأحد طرفي القناة. وهذه هي الطريقة التي تنفّذ بها الصدَفات cmd1 | cmd2، فتصل مخرجات أمر بمدخلات الأمر التالي.
#include <unistd.h>
void stdout_to_pipe(int fd[2]) {
close(fd[0]);
dup2(fd[1], STDOUT_FILENO); /* writes to stdout go into pipe */
close(fd[1]);
}القنوات المُسمّاة (FIFOs)
تصل القناة العادية بين العمليات المترابطة فقط. أما القناة المُسمّاة (FIFO)، التي تُنشأ باستخدام mkfifo، فتظهر في نظام الملفات، ولذلك يمكن للعمليات غير المترابطة فتحها عبر المسار والتواصل من خلالها.
#include <sys/stat.h>
int make_fifo(const char *path) {
return mkfifo(path, 0666); /* creates a FIFO file */
}خطر SIGPIPE
تؤدي الكتابة إلى قناة أُغلق طرف القراءة فيها إلى رفع الإشارة SIGPIPE، التي تنهي العملية افتراضيًا. لذلك إما أن تتجاهلوا الإشارة، أو تتحققوا من خطأ EPIPE الذي يعيده write.
متى تستخدمون القنوات
تُعد القنوات مثالية للبث البسيط أحادي الاتجاه بين عملية أب وعملية ابن، أو لربط البرامج على التوالي. أما للاتصال ثنائي الاتجاه أو بين عمليات غير مترابطة، فاستخدموا FIFOs أو المقابس أو الذاكرة المشتركة.
تحقّق سريع
اختبر مدى فهمك للقنوات.
مراجعة
تعلّمتم استخدام القنوات للتواصل بين العملية الأب والعملية الابن.
- يعطي
pipe()القيمة fd[0] (للقراءة) والقيمة fd[1] (للكتابة) - ادمجوها مع
fork، وأغلقوا الأطراف غير المستخدمة - تعيد read القيمة 0 عند EOF بعد إغلاق جميع أطراف الكتابة
- تصل FIFOs بين العمليات غير المترابطة؛ واحذروا SIGPIPE
الأسئلة الشائعة
هل درس «الأنابيب» مجاني؟
نعم — نص درس «الأنابيب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأنابيب»؟
الاتصال بين الأصل والفرع تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الأنابيب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.