واجهة طرفية POSIX
تُعدّ واجهة طرفية POSIX تجريدًا عامًا، يشمل كلًا من واجهة برمجة التطبيقات للبرامج، ومجموعة من التوقعات السلوكية لمستخدمي الطرفية ، كما هو مُحدد في معيار POSIX ومواصفات يونكس الموحدة . وهي تطور تاريخي من واجهات الطرفية في إصدار BSD 4 وإصدار يونكس السابع .
المفاهيم الأساسية العامة
الأجهزة
تُعتبر مجموعة من أجهزة الإدخال/الإخراج بمثابة "محطات طرفية" في أنظمة يونكس. [ 1 ] [ 2 ] وتشمل هذه:
- الأجهزة التسلسلية المتصلة عبر منفذ تسلسلي مثل الطابعات / أجهزة الطباعة عن بعد ، وأجهزة الكتابة عن بعد ، وأجهزة المودم التي تدعم المحطات الطرفية البعيدة عبر الوصول عبر الطلب الهاتفي ، والمحطات الطرفية المحلية المتصلة مباشرة [ 1 ] [ 3 ] [ 4 ] [ 5 ]
- محول العرض وأجهزة لوحة المفاتيح المدمجة مباشرة في وحدة النظام، يتم أخذها معًا لتشكيل "وحدة تحكم" محلية، والتي يمكن عرضها للمستخدمين والبرامج كمحطة طرفية واحدة CRT أو كمحطات طرفية افتراضية متعددة [ 1 ].
- برامج محاكاة الطرفيات ، مثل xterm و Konsole و GNOME Terminal و Terminal ، وخوادم الشبكة مثل برنامج rlogin وبرنامج SSH ، والتي تستخدم طرفيات وهمية.
الذكاء والقدرات الطرفية
الذكاء: المحطات الطرفية غبية، وليست ذكية
على عكس أنظمة الحواسيب المركزية المعاصرة، ولكن كغيرها من أنظمة تشغيل الحواسيب الصغيرة ، طُوّر نظام يونكس الأصلي خصيصًا للمحطات الطرفية البسيطة ، ولا يزال هذا هو الحال حتى اليوم. [ 6 ] المحطة الطرفية هي جهاز مُوجّه نحو الأحرف، يتألف من تدفقات من الأحرف تُستقبل منه وتُرسل إليه. [ 6 ] [ 7 ] على الرغم من أن تدفقات الأحرف مُهيكلة، وتتضمن أحرف تحكم ورموز هروب وأحرفًا خاصة، إلا أن بروتوكول الإدخال/الإخراج ليس مُهيكلًا كما هو الحال في المحطات الطرفية الذكية . لا توجد مواصفات لتنسيق الحقول، ولا يوجد نقل كتلي لشاشات كاملة (نماذج إدخال) من بيانات الإدخال.
وعلى النقيض من ذلك، تستخدم الحواسيب المركزية عادةً محطات طرفية موجهة نحو الكتل .
القدرات: terminfo، termcap، اللعنات، وآخرون.
تتضمن "قدرات" الطرفية ميزات طرفية بسيطة متعددة تتجاوز ما هو متاح في آلة الكتابة عن بُعد، ويمكن للبرامج الاستفادة منها. وتشمل هذه القدرات (بشكل أساسي) رموزًا خاصة يمكن إرسالها إلى الطرفية أو استقبالها منها. تؤدي الرموز الخاصة المرسلة إلى الطرفية وظائف متنوعة يمكن لطرفية شاشة CRT (أو برنامج محاكاة الطرفية) القيام بها، ولا تستطيع آلة الكتابة عن بُعد القيام بها، مثل تحريك مؤشر الطرفية إلى مواضع على الشاشة، ومسح الشاشة أو أجزاء منها أو تمريرها، وتشغيل وإيقاف الطابعات المتصلة، ومفاتيح الوظائف القابلة للبرمجة، وتغيير ألوان وخصائص العرض (مثل عكس الفيديو )، وتعيين عناوين العرض. أما الرموز الخاصة المستلمة من الطرفية فتشير إلى وظائف مثل مفتاح الوظيفة ، ومفتاح السهم ، وضغطات المفاتيح الخاصة الأخرى ( مفتاح الصفحة الرئيسية ، ومفتاح النهاية ، ومفتاح المساعدة ، ومفتاح الصفحة لأعلى ، ومفتاح الصفحة لأسفل ، ومفتاح الإدراج ، ومفتاح الحذف ، وما إلى ذلك). [ 8 ] [ 9 ]
تُشفّر هذه الإمكانيات في قواعد بيانات يُهيئها مسؤول النظام ، ويتم الوصول إليها من البرامج عبر مكتبة terminfo (التي حلت محل مكتبة termcap الأقدم )، والتي بدورها تُبنى عليها مكتبات أخرى مثل curses و ncurses . تستخدم برامج التطبيقات إمكانيات الطرفية لتوفير واجهات مستخدم نصية تتضمن نوافذ، ومربعات حوار، وأزرار، وعلامات، وحقول إدخال، وقوائم، وما إلى ذلك. [ 10 ] [ 11 ]
التحكم في متغيرات البيئة: TERMوآخرون.
تُستمد مجموعة الإمكانيات الخاصة بالطرفية التي يستخدمها برنامج (مُدرك للطرفية) في إدخال وإخراج البيانات من قاعدة البيانات، بدلاً من تضمينها مباشرةً في البرامج والمكتبات، ويتم التحكم بها بواسطة TERMمتغير البيئة (واختياريًا، بالنسبة لمكتبتي termcap وterminfo، بواسطة متغيري البيئة TERMCAPو TERMINFOعلى التوالي). [ 10 ] يتم تعيين هذا المتغير بواسطة برنامج مراقبة الطرفية الذي يُشغّل البرامج التي تستخدم تلك الطرفية لإدخال وإخراج البيانات، أو أحيانًا بشكل صريح. على سبيل المثال:
- يقوم برنامج getty (أو ما يعادله) بتعيين
TERMمتغير البيئة وفقًا لقاعدة بيانات النظام (بشكل مختلف inittab أو ملفات التكوين لبرامج ttymon أو launchd ) التي تحدد المحطات الطرفية المحلية المتصلة بمنافذ التسلسل وأنواع المحطات الطرفية التي توفرها المحطات الطرفية الافتراضية المحلية أو وحدة تحكم النظام المحلية. - لا يستخدم مستخدم الاتصال الهاتفي على جهاز طرفي بعيد نوع الجهاز الطرفي الذي يتوقعه النظام عادةً على خط الاتصال هذا، لذا يقوم بتعيين
TERMمتغير البيئة يدويًا فور تسجيل الدخول إلى النوع الصحيح. (في أغلب الأحيان، يتطابق نوع الجهاز الطرفي الذي يعيّنه برنامج getty لخط الاتصال الهاتفي، والذي حدده مسؤول النظام على أنه الأكثر استخدامًا من قبل مستخدمي الاتصال الهاتفي مع الأجهزة الطرفية البعيدة، مع النوع الذي يستخدمه مستخدم الاتصال الهاتفي، وبالتالي لا يحتاج هذا المستخدم إلى تغيير نوع الجهاز الطرفي). - يقوم برنامج خادم SSH (أو ما يعادله مثل برنامج rlogin ) بتعيين
TERMمتغير البيئة إلى نفس نوع الطرفية الخاص بعميل SSH. [ 12 ] - يقوم برنامج محاكاة الطرفية، باستخدام طرفية افتراضية، بتعيين
TERMمتغير البيئة لتحديد نوع الطرفية التي يحاكيها. غالبًا ما لا تتطابق الطرفيات المحاكاة تمامًا مع أجهزة الطرفيات الحقيقية، ولذلك تُخصص أسماء أنواع لبرامج محاكاة الطرفيات.xtermعلى سبيل المثال، يُعيّن برنامج xterm (افتراضيًا) نوع الطرفية إلى . [ 13 ] ويُعيّن برنامج GNU Screenscreenنوع الطرفية إلى .
التحكم في الوظيفة
توفر المحطات الطرفية إمكانيات للتحكم في العمليات. ويمكن للمستخدم، بشكل تفاعلي، إرسال أحرف تحكم لإيقاف العملية الجارية مؤقتًا، والعودة إلى واجهة التحكم التفاعلية التي أنشأت العملية، كما يمكنه تشغيل أوامر لوضع العمليات في "الخلفية" أو لنقل عملية أخرى من الخلفية إلى المقدمة (مع إعادة تشغيلها عند الضرورة). [ 14 ] [ 15 ]
الانضباطات الخطية
بالمعنى الدقيق، يتألف جهاز الطرفية في أنظمة يونكس من برنامج تشغيل جهاز tty الأساسي ، المسؤول عن التحكم المادي في مكونات الجهاز عبر تعليمات الإدخال/الإخراج ومعالجة طلبات مقاطعة الجهاز لإدخال وإخراج الأحرف، بالإضافة إلى نظام إدارة الخطوط . نظام إدارة الخطوط مستقل عن مكونات الجهاز الفعلية، ويمكن استخدامه نفسه في جهاز تجميع طرفيات مسؤول عن التحكم في عدة طرفيات، كما هو الحال في الطرفية الوهمية. في الواقع، نظام إدارة الخطوط (أو أنظمة إدارة الخطوط في أنظمة BSD وAIX وغيرها ) هو نفسه في جميع أجهزة الطرفية. وهو المسؤول عن الصدى المحلي، وتحرير الأسطر، ومعالجة أنماط الإدخال، ومعالجة أنماط الإخراج، وتعيين الأحرف. كل هذه العمليات مستقلة عن المكونات المادية الفعلية، إذ تتعامل مع المفاهيم المجردة البسيطة التي يوفرها برنامج تشغيل جهاز tty: إرسال حرف، واستقبال حرف، وتعيين حالات مختلفة للمكونات المادية. [ 16 ] [ 17 ]
في أنظمة يونكس الإصدار السابع ، وأنظمة بي إس دي ومشتقاتها بما في ذلك ماك أو إس ، ولينكس ، يمكن تبديل كل جهاز طرفي بين عدة مسارات خطية. [ 18 ] في نظام AT & T STREAMS ، المسارات الخطية هي وحدات STREAMS يمكن إضافتها إلى مكدس إدخال/إخراج STREAMS وإزالتها منه. [ 19 ]
تاريخ
تم اشتقاق واجهة طرفية POSIX من واجهات طرفية لأنظمة Unix المختلفة.
أنظمة يونكس المبكرة: الإصدار السابع من يونكس
كانت واجهة الطرفية التي وفرها نظاما يونكس 32V والإصدار السابع من يونكس، والتي قدمها أيضًا نظام بي إس دي الإصدار 4 كبرنامج تشغيل طرفي قديم ، بسيطة، وموجهة بشكل أساسي نحو استخدام أجهزة الكتابة عن بُعد كطرفيات. كان الإدخال يُسجل سطرًا سطرًا، حيث كان برنامج التشغيل في نظام التشغيل (وليس الطرفيات نفسها) يوفر إمكانيات تحرير الأسطر البسيطة. وكان النواة يحتفظ بمخزن مؤقت تتم فيه عملية التحرير. ولم تكن التطبيقات التي تقرأ مدخلات الطرفية تتلقى محتويات المخزن المؤقت إلا عند returnالضغط على مفتاح إنهاء تحرير السطر في الطرفية. وكان المفتاح المُرسل من الطرفية إلى النظام يمحو ("يُنهي") جميع محتويات المخزن المؤقت الحالية، وعادةً ما يُعرض كرمز " @ " متبوعًا بتسلسل سطر جديد لنقل موضع الطباعة إلى سطر فارغ جديد. يؤدي المفتاح المُرسَل من الجهاز الطرفي إلى النظام إلى مسح الحرف الأخير من نهاية مخزن التحرير، ويُعرض عادةً كرمز " # "، والذي يتعين على المستخدمين التعرف عليه كدلالة على مسح الحرف السابق (إذ لا تستطيع آلات الكتابة عن بُعد مسح الأحرف بعد طباعتها على الورق). [ 20 ] [ 21 ] [ 22 ] [ 23 ] [ 18 ]@#
من وجهة نظر البرمجة، كان لجهاز طرفي معدلات نقل واستقبال البيانات ، وحرفي "مسح" و"إيقاف" (اللذان يقومان بتحرير الأسطر، كما هو موضح)، وحرفي "مقاطعة" و"إنهاء" (اللذان يولدان إشارات لجميع العمليات التي يتحكم بها الجهاز الطرفي)، وحرفي "بدء" و"إيقاف" (المستخدمان للتحكم في تدفق المودم )، وحرف "نهاية الملف" (الذي يعمل كحرف إرجاع السطر باستثناء أنه يُحذف من المخزن المؤقت بواسطة read()استدعاء النظام، وبالتالي قد يتسبب في إرجاع نتيجة فارغة)، بالإضافة إلى العديد من علامات الوضع الأساسية التي تحدد ما إذا كان برنامج تشغيل الطرفية في النواة يحاكي الصدى المحلي ، وما إذا كان التحكم في تدفق المودم مُفعلاً، وأطوال تأخيرات الإخراج المختلفة، وتعيين حرف إرجاع السطر، وأنماط الإدخال الثلاثة. [ 24 ]
كانت أوضاع الإدخال الثلاثة كالتالي:
- وضع الخط (يسمى أيضًا وضع "الطهي")
في وضع السطر، يقوم نظام معالجة الأسطر بتنفيذ جميع وظائف تحرير الأسطر، ويتعرف على أحرف التحكم "المقاطعة" و"الخروج"، ويحولها إلى إشارات تُرسل إلى العمليات. تتلقى برامج التطبيقات التي تقرأ من الطرفية أسطرًا كاملة، بعد أن يُكمل المستخدم تحرير السطر بالضغط على زر الإدخال. [ 21 ] [ 25 ]
- وضع cbreak
يُعدّ وضع cbreak أحد وضعَي معالجة الأحرف المتتالية. ( وقد أشار إليه ستيفن ر. بورن مازحًا ( بورن، 1983 ، ص 288) بأنه وضع "غير مكتمل" وبالتالي "نادر"). لا يُجري نظام التحكم في الأسطر أي تعديل عليها، وتُعامل تسلسلات التحكم الخاصة بوظائف تعديل الأسطر كمدخلات أحرف عادية. تستقبل برامج التطبيقات التي تقرأ من الطرفية الأحرف فورًا، بمجرد توفرها في قائمة انتظار الإدخال . مع ذلك، لا تزال أحرف التحكم "المقاطعة" و"الخروج"، بالإضافة إلى أحرف التحكم في تدفق المودم، تُعالج بشكل خاص وتُحذف من دفق الإدخال. [ 26 ] [ 27 ]
- الوضع الخام
- الوضع الخام هو الوضع الآخر من بين وضعي معالجة الأحرف المتتالية. لا يُجري هذا الوضع أي تعديل على الأسطر، وتُعامل تسلسلات التحكم لكل من وظائف تعديل الأسطر والأحرف الخاصة المختلفة ("مقاطعة"، "إنهاء"، والتحكم في التدفق) كمدخلات أحرف عادية. تستقبل برامج التطبيقات التي تقرأ من الطرفية الأحرف فورًا، وتستقبل كامل تدفق الأحرف دون تغيير، تمامًا كما ورد من جهاز الطرفية نفسه. [ 28 ] [ 26 ] [ 27 ]
كانت واجهة البرمجة للاستعلام عن جميع هذه الأوضاع وأحرف التحكم وتعديلها هي ioctl()استدعاء النظام . (وقد حل هذا محل استدعاءات النظام stty()و في الإصدار السادس من يونكس). [ 29 ] [ 30 ] على الرغم من إمكانية تعديل حرفي "المسح" و"القتل" من قيمهما الافتراضية و ، إلا أنهما ظلا لسنوات عديدة القيم الافتراضية المُسبقة في برامج تشغيل أجهزة الطرفية، وفي العديد من أنظمة يونكس، التي لم تُغير إعدادات أجهزة الطرفية إلا كجزء من عملية تسجيل الدخول، في نصوص تسجيل دخول النظام التي تُنفذ بعد إدخال المستخدم لاسم المستخدم وكلمة المرور، كان لا بد من تصحيح أي أخطاء في مطالبات تسجيل الدخول وكلمة المرور باستخدام أحرف مفاتيح التحرير التاريخية الموروثة من أجهزة الطباعة عن بُعد. [ 23 ]gtty()#@
BSD: ظهور التحكم في الوظائف
مع أنظمة بي إس دي يونكس، ظهرت ميزة التحكم في العمليات ، وبرنامج تشغيل طرفي جديد ذو إمكانيات موسعة. [ 18 ] تضمنت هذه الإضافات أحرفًا خاصة إضافية (قابلة للتعديل برمجيًا أيضًا):
- تسببت أحرف "التعليق" و"التعليق المؤجل" (افتراضياً + و + — ASCII و ) في توليد إشارة جديدة للعمليات في مجموعة عمليات التحكم في الجهاز الطرفي. [ 27 ]ControlZControlY
SUBEMSIGTSTP - تُؤدي الأحرف "مسح الكلمة" و"التالي الحرفي" و"إعادة الطباعة" (افتراضيًا + و + و + - ASCII و و و ) وظائف إضافية لتحرير الأسطر. يمسح "مسح الكلمة" الكلمة الأخيرة في نهاية مخزن تحرير الأسطر. يسمح "التالي الحرفي" بإدخال أي حرف خاص في مخزن تحرير الأسطر (وهي وظيفة متوفرة، وإن كانت غير ملائمة بعض الشيء، في الإصدار السابع من يونكس عبر حرف الشرطة المائلة العكسية). يُعيد "إعادة الطباعة" طباعة محتويات مخزن تحرير الأسطر الحالية على سطر جديد (مفيد عندما تُنتج عملية أخرى تعمل في الخلفية مخرجات تتداخل مع تحرير الأسطر). [ 27 ]ControlWControlVControlR
ETBSYNDC2
كانت واجهة البرمجة للاستعلام عن جميع هذه الأوضاع الإضافية وأحرف التحكم وتعديلها لا تزال هي ioctl()استدعاء النظام، الذي وصفه مبتكروه ( ليفلر وآخرون، 1989 ، ص 262) بأنه "واجهة مزدحمة نوعًا ما". تم الاحتفاظ بجميع وظائف الإصدار السابع الأصلي من يونكس، وأُضيفت الوظائف الجديدة عبر رموز عمليات إضافية، مما أدى إلى واجهة برمجة نمت بشكل واضح، وتضمنت بعض التكرار في الوظائف. [ 31 ] ioctl()
النظام الثالث والنظام الخامس
قدّم النظام الثالث واجهة برمجة جديدة جمعت بين عمليات الإصدار السابع المنفصلة ioctl()لجلب وتعيين العلامات، وجلب وتعيين أحرف التحكم، في استدعاءات تستخدم termioبنيةً لتخزين كلٍّ من العلامات وأحرف التحكم، بحيث يمكن جلبها في عملية واحدة وتعيينها في عملية أخرى. كما قسّم بعض العلامات من واجهة الإصدار السابع إلى علامات منفصلة متعددة، وأضاف بعض الإمكانيات الإضافية، مع أنه لم يدعم التحكم في العمليات أو تحسينات الوضع المُعالَج في نظام 4BSD. [ 32 ] على سبيل المثال، استبدل أوضاع "cooked" و"cbreak" و"raw" في الإصدار السابع بتجريدات مختلفة. يُعدّ التعرّف على الأحرف المُولِّدة للإشارات مستقلاً عن وضع الإدخال، ولا يوجد سوى وضعَي إدخال: الوضع القياسي والوضع غير القياسي. (يُتيح هذا وضع إدخال طرفي غير موجود في الإصدار السابع ونظام BSD: الوضع القياسي مع تعطيل توليد الإشارات).
استخدمت الأنظمة اللاحقة للنظام الثالث، بما في ذلك النظام الخامس ، نفس الواجهة.
نظام POSIX: التوحيد والتجريد
إحدى المشكلات الرئيسية التي عالجها معيار POSIX بتعريفه لواجهة طرفية عامة هي كثرة الواجهات البرمجية. مع أن سلوك المحطات الطرفية كان موحدًا إلى حد كبير بين الأنظمة بحلول وقت صدور المعيار، إذ تبنت معظم أنظمة يونكس مفاهيم انضباط الأسطر وقدرات التحكم في العمليات في أنظمة BSD، إلا أن الواجهة البرمجية للمحطات الطرفية عبر ioctl()استدعاء النظام كانت معقدة. فقد وفرت أنظمة يونكس المختلفة ioctl()عمليات مختلفة، بأسماء (رمزية) مختلفة، وعلامات مختلفة. وكان على الشيفرة المصدرية القابلة للنقل أن تحتوي على قدر كبير من الترجمة الشرطية لاستيعاب الاختلافات بين منصات البرمجيات، على الرغم من أنها جميعًا تُصنف نظريًا ضمن أنظمة يونكس. [ 33 ]
يستبدل معيار POSIX ioctl()النظام بالكامل، بمجموعة من دوال المكتبة (التي يمكن تنفيذها ، بالطبع، داخليًا عبر ioctl()عمليات خاصة بالمنصة) بأسماء ومعاملات موحدة. استُخدمت termioبنية بيانات نظام يونكس System V كنموذج لبنية termiosبيانات POSIX، التي لم تتغير حقولها إلى حد كبير باستثناء استخدامها الآن لأنواع بيانات بديلة لتحديد الحقول، مما يسمح للمطورين بنقلها بسهولة عبر بنى معالجات متعددة، بدلاً من اشتراط أنواع البيانات الصريحة unsigned shortللغتي charالبرمجة C وC++ (والتي قد تكون أحجامها غير ملائمة في بعض بنى المعالجات). [ 33 ] [ 34 ]
كما قدم نظام POSIX دعمًا للتحكم في الوظائف، حيث termiosيحتوي الهيكل على أحرف التعليق والتعليق المؤجل بالإضافة إلى أحرف التحكم التي يدعمها النظام الثالث والنظام الخامس. ولم يضف أيًا من امتدادات الوضع المطبوخ من BSD، على الرغم من أن أنظمة SunOS 4.x و System V Release 4 بما في ذلك Solaris و HP-UX و AIX وأنظمة BSD الأحدث و macOS و Linux قد نفذتها كامتدادات لـ termios.
ما يحدده المعيار
محطات التحكم ومجموعات العمليات
لكل عملية في النظام إما طرفية تحكم واحدة ، أو لا طرفية تحكم على الإطلاق. ترث العملية طرفية التحكم من العملية الأصلية، والعمليات الوحيدة التي تُجرى على العملية هي اكتساب طرفية تحكم، من قِبل عملية ليس لديها طرفية تحكم، والتخلي عنها، من قِبل عملية لديها طرفية تحكم. [ 33 ]
لم تُحدد طريقة محمولة للحصول على طرفية تحكم، إذ تُحدد الطريقة حسب التنفيذ. يُحدد المعيار علامةً O_NOCTTYلاستدعاء open()النظام ، وهي الطريقة التي تمنع الطريقة التقليدية للحصول على طرفية تحكم (عملية ليس لديها طرفية تحكم open()في ملف جهاز طرفي ليس طرفية تحكم لعملية أخرى، دون تحديد O_NOCTTYالعلامة [ 35 ] )، ولكنه يترك دلالاتها التقليدية اختيارية.
كل عملية هي أيضًا عضو في مجموعة عمليات. يسجل كل جهاز طرفي مجموعة عمليات تُسمى مجموعة عمليات الواجهة الأمامية . تتحكم مجموعات العمليات في الوصول إلى الجهاز الطرفي وإرسال الإشارات. تُرسل الإشارات المُولَّدة في الجهاز الطرفي إلى جميع العمليات الأعضاء في مجموعة عمليات الواجهة الأمامية للجهاز الطرفي. read()كما أن write()عمليات الإدخال/الإخراج على الجهاز الطرفي بواسطة عملية ليست عضوًا في مجموعة عمليات الواجهة الأمامية للجهاز الطرفي ستؤدي، وقد تؤدي اختياريًا (على التوالي)، إلى إرسال إشارات ( SIGTTINو SIGTTOUعلى التوالي) إلى العملية المُستدعِية. تتشابه وظائف المكتبة المختلفة المُغيِّرة لوضع الجهاز الطرفي في السلوك مع وظيفة write()، باستثناء أنها تُولِّد الإشارات دائمًا، حتى لو تم تعطيل هذه الوظيفة لنفسها write(). [ 36 ] [ 37 ]
termiosبنية البيانات
بنية البيانات المستخدمة في جميع استدعاءات مكتبة الطرفية هي termiosالبنية [ 38 ] التي يكون تعريفها في لغة البرمجة C و C++ كما يلي: [ 34 ]
struct termios { tcflag_t c_iflag ; // أوضاع الإدخال tcflag_t c_oflag ; // أوضاع الإخراج tcflag_t c_cflag ; // أوضاع التحكم tcflag_t c_lflag ; // الأوضاع المحلية cc_t c_cc [ NCCS ]; // أحرف التحكم };لا يُحدد ترتيب الحقول داخل termiosالبنية، ويُسمح للتطبيقات بإضافة حقول غير قياسية. [ 34 ] في الواقع، يتعين على التطبيقات إضافة حقول غير قياسية لتسجيل معدلات نقل البيانات للإدخال والإخراج. تُسجل هذه الحقول في البنية، بصيغة تُحددها التطبيق، ويتم الوصول إليها عبر دوال الوصول، بدلاً من التلاعب المباشر بقيم الحقول، كما هو الحال بالنسبة لحقول البنية القياسية. [ 39 ]
تُعرَّف أسماء أنواع البيانات tcflag_tالبديلة cc_t، بالإضافة إلى الثوابت الرمزية NCCSوالثوابت الرمزية لعلامات الوضع المختلفة، وأسماء أحرف التحكم، ومعدلات الباود، في ملف رأس قياسي termios.h. (يجب عدم الخلط بين هذا الملف وملف الرأس الذي يحمل اسمًا مشابهًا termio.hمن النظامين III وV، والذي يُعرِّف بنية مماثلة termioوالعديد من الثوابت الرمزية ذات الأسماء المتشابهة. هذه الواجهة خاصة بالنظامين III وV، ولن يكون الكود الذي يستخدمها قابلاً للنقل بالضرورة إلى أنظمة أخرى.) [ 40 ]
حقول الهيكل هي (باختصار، للاطلاع على التفاصيل، انظر المقال الرئيسي ):
c_iflag- علامات وضع الإدخال للتحكم في تكافؤ الإدخال، وترجمة سطر الإدخال، والتحكم في تدفق المودم ، ونظافة 8 بت ، والاستجابة لحالة "الانقطاع" (للمنفذ التسلسلي) [ 34 ]
c_oflag- علامات وضع الإخراج للتحكم في معالجة الإخراج المحددة مسبقًا، وترجمة سطر الإخراج، وتأخيرات الإخراج بعد إرسال أحرف التحكم المختلفة [ 41 ] [ 27 ]
c_cflag- علامات التحكم في الأجهزة الطرفية للتحكم في الجهاز الطرفي الفعلي بدلاً من نظام الخط: عدد البتات في الحرف، ونوع التكافؤ، والتحكم في إنهاء المكالمة، والتحكم في تدفق الخط التسلسلي [ 42 ] .
c_lflag- علامات التحكم المحلية للتحكم في انضباط الخط بدلاً من أجهزة المحطة الطرفية: الوضع المتعارف عليه، أوضاع الصدى، التعرف على الأحرف ومعالجتها، وتمكين توليد الإشارة
SIGTTOUعن طريقwrite()استدعاء النظام [ 39 ].
وظائف المكتبة هي (باختصار، للاطلاع على التفاصيل، انظر المقالة الرئيسية ):
tcgetattr()- الاستعلام عن إعدادات السمات الحالية لجهاز طرفي في
termiosبنية [ 43 ] tcsetattr()- قم بتعيين إعدادات سمات الجهاز الطرفي الحالية من
termiosبنية، مع إمكانية الانتظار حتى يتم تصريف الإخراج الموجود في قائمة الانتظار وتفريغ الإدخال الموجود في قائمة الانتظار [ 43 ]. cfgetispeed()- الاستعلام عن معدل نقل البيانات المدخل من الحقول المحددة في
termiosبنية [ 44 ] cfgetospeed()- استعلم عن معدل الباود الناتج من الحقول المحددة في التنفيذ في
termiosبنية [ 44 ] cfsetispeed()- قم بتعيين معدل نقل البيانات المدخلة في الحقول المحددة في التنفيذ في
termiosبنية [ 44 ] cfsetospeed()- قم بتعيين معدل الباود للإخراج في الحقول المحددة بالتنفيذ في
termiosبنية [ 44 ] tcsendbreak()- إرسال إشارة "قطع" المودم على طرفية جهاز تسلسلي [ 45 ]
tcdrain()- انتظر حتى يتم تصريف المخرجات الموجودة في قائمة الانتظار [ 45 ]
tcflush()- تجاهل المدخلات الموجودة في قائمة الانتظار [ 45 ]
tcflow()- التحكم في تدفق التغيير [ 45 ]
tcgetpgrp()- الاستعلام عن مجموعة عمليات الواجهة الأمامية للطرفية [ 46 ]
tcsetpgrp()- قم بتعيين مجموعة عمليات الواجهة الأمامية للطرفية [ 46 ]
الأحرف الخاصة
| مجال | معنى | تم استرجاعها بواسطةread() | ملحوظات |
|---|---|---|---|
c_cc[VEOF] | نهاية الملف | لا | تتم المعالجة فقط بواسطة وضع التحرير القياسي للأسطر |
c_cc[VEOL] | نهاية السطر | نعم | تتم المعالجة فقط بواسطة وضع التحرير القياسي للأسطر |
c_cc[VERASE] | "محو" | لا | تتم المعالجة فقط بواسطة وضع التحرير القياسي للأسطر |
c_cc[VKILL] | "قتل" | لا | تتم المعالجة فقط بواسطة وضع التحرير القياسي للأسطر |
c_cc[VINTR] | "مقاطعة" | لا | خاصية توليد الإشارة مستقلة عن وضع الإدخال |
c_cc[VQUIT] | "يترك" | لا | خاصية توليد الإشارة مستقلة عن وضع الإدخال |
c_cc[VSUSP] | "تعليق" | لا | خاصية توليد الإشارة مستقلة عن وضع الإدخال |
c_cc[VSTOP] | "قف" | لا | خاصية التحكم في تدفق المودم مستقلة عن وضع الإدخال |
c_cc[VSTART] | "يبدأ" | لا | خاصية التحكم في تدفق المودم مستقلة عن وضع الإدخال |
يُحدد عنصر المصفوفة في بنية البيانات جميع الأحرف الخاصة (القابلة للتعديل برمجيًا). مؤشرات المصفوفة عبارة عن ثوابت رمزية، واحد لكل نوع من أنواع الأحرف الخاصة، كما هو موضح في الجدول على اليمين. (يوجد عنصران إضافيان في المصفوفة يتعلقان بمعالجة الإدخال في الوضع غير القياسي، وسيتم مناقشتهما لاحقًا.) [ 43 ]c_cc[]termios
الأحرف الخاصة غير القابلة للتعديل برمجياً هي حرف تغذية السطر (ASCII LF) وحرف إرجاع المؤشر (ASCII CR). [ 47 ]
معالجة المدخلات
تُحدد معالجة المدخلات سلوك read()استدعاء النظام على جهاز طرفي، وخصائص تحرير الأسطر وتوليد الإشارات في نظام الخط. على عكس نظام يونكس الإصدار السابع ونظام بي إس دي الإصدار 4، وكما هو الحال في نظامي System III وSystem V، يعمل تحرير الأسطر في أحد وضعين فقط: الوضع القياسي والوضع غير القياسي. ويكمن الفرق الأساسي بينهما في متى تكون البيانات "متاحة للقراءة" من وجهة نظر متطلبات الحظر/عدم الحظر لاستدعاء النظام read()(المحددة بواسطة O_NONBLOCKالعلامة الموجودة على واصف الملف عبر open()أو fcntl()). [ 48 ]
معالجة الوضع الكنسي
في الوضع القياسي، تُجمّع البيانات في مخزن مؤقت لتحرير الأسطر، ولا تُصبح "متاحة للقراءة" إلا بعد إنهاء تحرير الأسطر من قِبل المستخدم (في الطرفية) بإرسال حرف فاصل الأسطر . أحرف فاصل الأسطر هي أحرف خاصة، وهي: نهاية الملف ، ونهاية السطر ، وتغذية السطر (ASCII LF). يمكن ضبط الحرفين الأولين برمجيًا، بينما يكون الحرف الأخير ثابتًا. يُضمّن الحرفان الأخيران في مخزن تحرير الأسطر، بينما لا يُضمّن الحرف الأول. [ 49 ]
بتعبير أدق، يتم تجميع صفر أو أكثر من الأسطر في مخزن تحرير الأسطر، مفصولة بفواصل أسطر (والتي قد تُحذف أو لا تُحذف read()عند قراءتها)، ويعمل تحرير الأسطر على الجزء من مخزن تحرير الأسطر الذي يلي فاصل السطر الأخير (إن وُجد) في المخزن. فعلى سبيل المثال، سيمحو حرف "المسح" (أياً كان ما تمت برمجته عليه) الحرف الأخير في مخزن الأسطر حتى فاصل السطر السابق فقط (دون تضمينه). [ 49 ]
معالجة الوضع غير القياسي
في الوضع غير القياسي، تُجمّع البيانات في مخزن مؤقت (قد يكون أو لا يكون مخزن تحرير الأسطر - إذ تحتوي بعض التطبيقات على قوائم انتظار منفصلة "للمدخلات المُعالجة" و"للمدخلات الخام") وتصبح "متاحة للقراءة" وفقًا لقيم مُعاملَي تحكم الإدخال، وهما عضوا بنية البيانات `and`. كلاهما كميات غير مُوقّعة (لأن ` and` يجب أن يكون اسمًا بديلًا لنوع غير مُوقّع). يُحدد الأول الحد الأدنى لعدد الأحرف، بينما يُحدد الثاني مهلة زمنية بأجزاء من عشرة من الثانية. [ 50 ] هناك أربعة احتمالات:c_cc[MIN]c_cc[TIME]termioscc_t
c_cc[TIME]وكلاهما يساوي صفرًاc_cc[MIN]- في هذه الحالة، تكون البيانات الموجودة في المخزن المؤقت "متاحة للقراءة" فورًا، ويتم
read()إرجاعها فورًا مع أي بيانات موجودة في المخزن المؤقت (مع إمكانية إرجاع صفر إذا لم تكن هناك بيانات متاحة). [ 51 ] c_cc[TIME]غير صفري و يساوي صفرًاc_cc[MIN]- في هذه الحالة، تصبح البيانات الموجودة في المخزن المؤقت "متاحة للقراءة" بعد انقضاء المهلة الزمنية المحددة، حيث يتم تشغيل المؤقت عند بدء
read()استدعاء النظام، أو عند استلام حرف واحد. بعبارة أخرى،read()ينتظر البرنامج لمدة زمنية إجمالية قصوى محددة، وقد لا يُرجع أي بيانات، أو يُرجع أي بيانات فور استلامها. [ 51 ] c_cc[TIME]يساوي صفرًا وهو ليس صفرًاc_cc[MIN]- في هذه الحالة، تصبح البيانات الموجودة في المخزن المؤقت "متاحة للقراءة" بعد استلام العدد المحدد من الأحرف فيه. بعبارة أخرى،
read()ينتظر البرنامج حدًا أدنى من البيانات (قد يكون أكبر مما هو مُعدّ للقراءة في استدعاء النظام)، ولن يُعيد بيانات صفرية، وقد ينتظر إلى أجل غير مسمى. [ 51 ] c_cc[TIME]وكلاهما غير صفريc_cc[MIN]- في هذه الحالة، تُصبح البيانات الموجودة في المخزن المؤقت "متاحة للقراءة" بعد استلام العدد المحدد من الأحرف فيه، أو بعد انقضاء مهلة الانتظار منذ إدخال آخر حرف. لا توجد مهلة انتظار للحرف الأول. بعبارة أخرى،
read()ينتظر البرنامج حدًا أدنى من البيانات (قد يكون أكبر مما هو مُعدّ للقراءة في استدعاء النظام)، ولن يُعيد بيانات صفرية، وقد ينتظر إلى أجل غير مسمى، ولكنه لن ينتظر لفترة أطول من مهلة الانتظار المحددة إذا كان هناك حرف واحد على الأقل في المخزن المؤقت للقراءة. [ 51 ]
معالجة المخرجات
لم يطرأ تغيير كبير على معالجة المخرجات مقارنةً بجذورها في نظامي التشغيل الثالث والخامس. وتحدد علامات التحكم في وضع الإخراج خيارات متنوعة.
- يمكن إدراج أحرف إرجاع السطر قبل كل حرف تغذية سطر، لترجمة دلالات سطر جديد في نظام يونكس إلى دلالات ASCII التي تتوقعها العديد من المحطات الطرفية. [ 27 ] [ 22 ]
- قد تُمنح المحطات الطرفية وقتًا لتنفيذ رموز تحكم مختلفة، والتي من شأنها (على آلة كاتبة عن بعد أو ما شابهها) أن تُؤدي إلى حركات مادية للعربة قد تستغرق وقتًا طويلًا (من وجهة نظر الحاسوب)، مثل مسح الأحرف، والجدولة الأفقية، وإرجاع السطر، وتغذية النموذج، وتغذية السطر. [ 27 ] [ 52 ]
ملحوظات
- 1 2 3 كريستيان 1988 ، ص. 11.
- ↑ بورن 1983 ، ص 6.
- ↑ كوفين 1991 ، ص 820.
- ↑ كوفين 1991 ، ص 23 – 24.
- ^ ليفلر وآخرون. 1989 ، ص. 259.
- 1 2 كوفين 1991 ، ص. 24.
- ^ ليفلر وآخرون. 1989 ، ص. 37 - 38.
- ↑ أفزال 2008 ، ص 419.
- ↑ فريش 2002 ، ص 770.
- 1 2 كوفين 1991 ، ص. 115.
- ↑ كوفين 1991 ، ص 372.
- ↑ كوفين 1991 ، ص 779.
- ↑ كوفين 1991 ، ص 751 – 752.
- ^ ليفلر وآخرون. 1989 ، ص. 265.
- ^ ليفلر وآخرون. 1989 ، ص. 103.
- ^ ليفلر وآخرون. 1989 ، ص. 38.
- ^ ليفلر وآخرون. 1989 ، ص. 260 - 261.
- 1 2 3 ليفلر وآخرون. 1989 ، ص. 262.
- ↑ كريستيان 1988 ، ص 395.
- ↑ بورن 1983 ، ص 8.
- 1 2 بورن 1983 ، ص. 130 – 131.
- 1 2 بورن 1983 ، ص. 287.
- 1 2 كريستيان 1988 ، ص. 26.
- ↑ بورن 1983 ، ص 132 – 133.
- ^ ليفلر وآخرون. 1989 ، ص. 259 - 260.
- 1 2 بورن 1983 ، ص. 288.
- 1 2 3 4 5 6 7 ليفلر وآخرون. 1989 ، ص. 260.
- ↑ بورن 1983 ، ص 132.
- ↑ بورن 1983 ، ص 133.
- ↑ كريستيان 1988 ، ص 393.
- ^ ليفلر وآخرون. 1989 ، ص. 262 – 263.
- ↑ "مصدر صفحة دليل System III tty(4)" . تم الاطلاع عليه في 5 أكتوبر 2012 .
- 1 2 3 زلوتنيك 1991 ، ص 157.
- 1 2 3 4 زلوتنيك 1991 ، ص 163.
- ↑ بورن 1983 ، ص 130.
- ↑ زلوتنيك 1991 ، ص 158.
- ↑ زلوتنيك 1991 ، ص 173 – 174.
- ↑ زلوتنيك 1991 ، ص 162.
- 1 2 زلوتنيك 1991 ، ص. 166.
- ↑ زلوتنيك 1991 ، ص 162 – 163.
- ↑ زلوتنيك 1991 ، ص 164.
- ↑ زلوتنيك 1991 ، ص 165.
- 1 2 3 زلوتنيك 1991 ، ص 167.
- 1 2 3 4 5 زلوتنيك 1991 ، ص 169.
- 1 2 3 4 زلوتنيك 1991 ، ص 172.
- 1 2 زلوتنيك 1991 ، ص. 174.
- 1 2 زلوتنيك 1991 ، ص. 159.
- ↑ زلوتنيك 1991 ، ص 160.
- 1 2 زلوتنيك 1991 ، ص. 160 – 161.
- ↑ زلوتنيك 1991 ، ص 161.
- 1 2 3 4 زلوتنيك 1991 ، ص 161 – 162.
- ↑ بورن 1983 ، ص 287 – 288.
مصادر
- أفزال، أمير (2008). يونكس بلا حدود: مدخل تمهيدي ( الطبعة الخامسة). برنتيس هول. ISBN 978-0-13-119449-6.
- بورن، ستيفن ر. (1983). نظام يونكس . سلسلة علوم الحاسوب الدولية. أديسون-ويسلي. ISBN 978-0-201-13791-0.
- كريستيان، كاري (1988). نظام التشغيل يونكس ( الطبعة الثانية). جون وايلي وأولاده. ISBN 978-0-471-84781-6.
- كوفين، ستيفن (1991). نظام يونكس الإصدار الخامس، الإصدار 4: المرجع الكامل . أوزبورن ماكجرو هيل. ISBN 978-0-07-881653-6.
- فريش، إيلين (2002). أساسيات إدارة النظام . دليل موجز ( الطبعة الثالثة). دار نشر أورايلي ميديا. رقم ISBN 978-0-596-00343-2.
- ليفلر، صموئيل ج.؛ ماكوسيك، مارشال كيرك ؛ كاريلز، مايكل ج.؛ كوارترمان، جون س. (1989). "معالجة الطرفيات". تصميم وتنفيذ نظام التشغيل يونكس 4.3BSD . سلسلة أديسون-ويسلي في علوم الحاسوب. أديسون-ويسلي. ISBN 978-0-201-06196-3.
- زلوتنيك، فريد (1991). "التحكم في الأجهزة الطرفية". معيار POSIX.1: دليل المبرمج . شركة بنجامين/كومينغز للنشر. ISBN 978-0-8053-9605-8.
للمزيد من القراءة
- "11. واجهة طرفية عامة" . المواصفات الأساسية لمجموعة Open Group . 6. مجموعة Open Group . 2004.
- ليوين، دونالد أ. (1991). "إدخال/إخراج الطرفية". دليل مبرمج POSIX: كتابة برامج UNIX قابلة للنقل باستخدام معيار POSIX.1 . سلسلة علوم الحاسوب. دار نشر أورايلي ميديا. رقم ISBN 978-0-937175-73-6.
- أجهزة الحاسوب
- بوسيكس
