المجاري القياسية (stdin-stdout-stderr) و استخدامها في الحاسوب

مقدمة

الهدف الرئيسي للحاسوب هو إدخال المستخدم للبيانات و يقع على عاتق الحاسوب المعالجة و الإخراج، طبعاً نحن نعلم أن الحاسوب مرتبط بالعديد من الطرفيات الثالثية (third-party peripherals)، هذه الطرفيات تشكل وسائل للإدخال و الإخراج كالشاشة و الطابعة و الفأرة و لوحة المفاتيح.

في هذا المنشور سنتعرف على كيفية عمل المجاري القياسية و التي تعمل على تسهيل و توحيد اسلوب الإدخال و الإخراج ضمن الحاسوب، خارج نطاق الطرفيات التي نعرفها

تاريخ بسيط..

لنصل إلى ما نحن عليه اليوم لنعد بالزمن قليلاً (لستينات القرن الماضي) بدأت بعض لغات البرمجة عالية المستوى بالظهور كفورتران، لم يكن في أول ظهورها دعم للمجاري القياسية، و السبب في هذا هو عدم توحيد معيارية الحواسيب وقتها فرغم أن الأفكار التي لا نزال نتعلمها من ذاك الماضي حاضرة إلى هذا اليوم إلا أن الحواسيب لم تكن تتبع لنظام توحيد يسهل في عملية البحث و التطوير في هذه المعيارية، و هذا سبب الكثير من المشكلات إذ أنه عليك تطوير برنامجك بناءاً على كل معيارية من معيارية الأجهزة، قبل ظهور UNIX في أوائل السبعينات.

مجاري الإدخال و الإخراج ببساطة

بكل بساطة المجاري في وقتنا الحاضر تتألف من 3 أنواع (مجاري إدخال و إخراج و خطأ) هذه المجاري يمكن التحكم بها عبر نظام التشغيل بحيث تقوم بتلقي مدخلات المستخدم (سواء عند نقره على المفاتيح في واجهة الطرفية، أو عبر ضخ ملف أو مُخرج برنامج آخر (Pipe lining).

من الممكن فهم هذه العمليات بشكل مشابه لعمل شبكة المياه ،إذ أنك تقوم بإدخال المياه للمجرى فتجري المياه من المدخل و ينتهي بها الأمر في المخرج، يمكن تشبه ذلك عملياً في Unix بهذا الأمر

$> echo hello <--- echo stdin to stdout  
hello <--- stdout 

ويمكن زيادة الأمور تعقيدا لتشمل عمليات أخرى فمثلاً لنقرأ حرف h من مخرج الأمر السابق من الممكن استخدام الأنابيب (pipes) لنقل مخرجات برنامج ما إلى مدخل برنامج آخر على هذا الشكل

$> echo hello | grep h
 ======^ echos hello into stdout
================^ grep receive stdin via the previous stdout
with a pipe, then stdout comes from grep, not echo

في هذه الحالة قمنا بعمل أنبوب يصل بين مخرج echo و مدخل grep

User --stdin--> echo --stdout--> pipe<out->in> grep --stdout--> User

و النتيجة هنا هو وصول مخرج grep فقط وليس echo و السبب هو الأنابيب. سنتحدث عنهم في وقت لاحق لكن لننتقل إلى أثرهم في لغات البرمجة.

الهدف الرئيسي: البرمجة و البرنامج.

إيجاد طريقة موحدة لإدخال وإخراج البيانات ساهمت باختصار الوقت وحل المشاكل فبعد ظهور UNIX و لغة c بات الأمر موحدا و أسهل من قبل, كما سنكتشفه هنا

سنبدأ بالبسيط، عند كتابتك لبرنامج واجهة نصية فلابد أنك سمعت عن IO Stream مرة، هذه مفيدة جداً إذ تتيح لنا أخذ مدخل من المستخدم عبر قراءة لوحة المفاتيح مثلاً و طباعة المخرجات بعد معالجتها إلى الشاشة أو عبر طابعة، أو آلة كاتبة.. حرفياً

مثال بسيط عليه بلغة بايثون:

import sys

# Writing to stdout
print("This is written to stdout")

# Writing to stderr
print("This is written to stderr", file=sys.stderr)

# Reading from stdin
user_input = input("Enter something: ")
print("You entered: ", user_input)

الكود أعلاه لا يحتاج إلى ما يزيد عن شرحه أعلاه و فيه، لكن إن لاحظتم ستجدون stderr وهذا قد يبدو جديد بالنسبة إليك..

هذا مجرى يساعد على الفصل بين المخرجات الذي يحتاجها المستخدم،و المخرجات التي قد لا يحتاجها، فعلى سبيل المثال قد تحصل مشكلة لا تهم المستخدم و تعتبر غير قيمة، فيمكن إرسالها عبر مجرى الخطأ إلى ملف و حفظه في حال طلبه المطور أو المسؤول عن صيانة البرنامج.

يتبع…

إعجابَين (2)