termios(3)

الاسم
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed, cfsetspeed - الحصول على سمات الجهاز الطرفي وتعيينها، والتحكم في الخط، والحصول على معدل الباود وتعيينه

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

موجز
#include <termios.h>
#include <unistd.h>

int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,
              const struct termios *termios_p);

int tcsendbreak(int fd, int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int action);

void cfmakeraw(struct termios *termios_p);

speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);

int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
int cfsetspeed(struct termios *termios_p, speed_t speed);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

cfsetspeed(), cfmakeraw():
    منذ glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.19 وما قبله:
        _BSD_SOURCE

الوصف
تصف دوال termios واجهة طرفية عامة وُفّرت للتحكم في منافذ الاتصال غير المتزامن.

  هيكل termios
العديد من الدوال الموصوفة هنا تحتوي على معامل termios_p وهو مؤشر إلى هيكل termios. يحتوي هذا الهيكل على الأقل على الأعضاء التالية:

    tcflag_t c_iflag;       /* أوضاع الإدخال */
    tcflag_t c_oflag;       /* أوضاع الإخراج */
    tcflag_t c_cflag;       /* أوضاع التحكم */
    tcflag_t c_lflag;       /* الأوضاع المحلية */
    cc_t c_cc[NCCS];       /* الأحرف الخاصة */

القيم التي يمكن تعيينها لهذه الحقول موصوفة أدناه. في حالة الحقول الأربعة الأولى لقناع البت، تُكشف تعريفات بعض الأعلام المرتبطة التي يمكن تعيينها فقط إذا عُرّف كلي اختبار ميزة محدد (انظر feature_test_macros(7))، كما هو مذكور بين قوسين ("[]").

في الأوصاف أدناه، "ليس في POSIX" يعني أن القيمة غير محددة في POSIX.1-2001، و"XSI" يعني أن القيمة محددة في POSIX.1-2001 كجزء من امتداد XSI.

ثوابت علم c_iflag:

IGNBRK
    تجاهل حالة BREAK عند الإدخال.

BRKINT
    إذا عُيّن IGNBRK، يُتجاهل BREAK. إذا لم يُعيّن ولكن عُيّن BRKINT، فإن BREAK يتسبب في مسح طوابير الإدخال والإخراج، وإذا كانت الطرفية هي الطرفية المتحكمة لمجموعة عمليات أمامية، فإنه يتسبب في إرسال SIGINT إلى مجموعة العمليات الأمامية هذه. عندما لا يُعيّن أي من IGNBRK أو BRKINT، يُقرأ BREAK كبايت فارغ ('\0')، باستثناء عندما يُعيّن PARMRK، وفي هذه الحالة يُقرأ كالتسلسل \377 \0 \0.

IGNPAR
    تجاهل أخطاء التأطير وأخطاء التكافؤ.

PARMRK
    إذا وُضعت هذه البتة، تُوسم البايتات المدخلة ذات أخطاء التكافؤ أو التأطير عند تمريرها إلى البرنامج. تكون هذه البتة ذات معنى فقط عندما تُضبط INPCK ولا تُضبط IGNPAR. طريقة وسم البايتات الخاطئة تكون ببايتين سابقتين، \377 و \0. وبالتالي، يقرأ البرنامج فعليًا ثلاث بايتات مقابل بايتة خاطئة واحدة وردت من الطرفية. إذا كانت قيمة بايتة صحيحة هي \377، ولم تُضبط ISTRIP (انظر أدناه)، فقد يخلطها البرنامج مع البادئة التي توسم خطأ التكافؤ. لذلك، تُمرر بايتة صحيحة \377 إلى البرنامج كبايتين، \377 \377، في هذه الحالة.

    إذا لم تُضبط لا IGNPAR ولا PARMRK، يُقرأ حرف ذو خطأ تكافؤ أو خطأ تأطير كـ \0.

INPCK
    تمكين فحص تكافؤ الإدخال.

ISTRIP
    إزالة البتة الثامنة.

INLCR
    ترجمة NL إلى CR عند الإدخال.

IGNCR
    تجاهل إرجاع العربة عند الإدخال.

ICRNL
    ترجمة إرجاع العربة إلى سطر جديد عند الإدخال (ما لم تُضبط IGNCR).

IUCLC
    (ليس في POSIX) تعيين الأحرف الكبيرة إلى أحرف صغيرة عند الإدخال.

IXON
    تمكين التحكم في التدفق XON/XOFF عند الإخراج.

IXANY
    (XSI) كتابة أي حرف سيعيد تشغيل الإخراج المتوقف. (المبدئي هو السماح فقط بحرف START لإعادة تشغيل الإخراج.)

IXOFF
    تمكين التحكم في التدفق XON/XOFF عند الإدخال.

IMAXBEL
    (ليس في POSIX) قرع الجرس عندما يكون طابور الإدخال ممتلئًا. لا ينفذ لينكس هذه البتة، ويتصرف كما لو أنها مضبوطة دائمًا.

IUTF8 (منذ لينكس 2.6.4)
    (ليس في POSIX) الإدخال هو UTF8؛ هذا يسمح بتنفيذ مسح المحارف بشكل صحيح في الوضع المطبوخ.

ثوابت العلم c_oflag:

OPOST
    تمكين معالجة المخرجات المُعرَّفة بالتنفيذ.

OLCUC
    (ليس في POSIX) تعيين المحارف الصغيرة إلى كبيرة عند الإخراج.

ONLCR
    (XSI) تعيين NL إلى CR-NL عند الإخراج.

OCRNL
    تعيين CR إلى NL عند الإخراج.

ONOCR
    لا تُخرج CR عند العمود 0.

ONLRET
    يُفترض أن المحرف NL يؤدي وظيفة إرجاع العربة؛ تُضبط فكرة النواة عن العمود الحالي إلى 0 بعد كل من NL وCR.

OFILL
    أرسل محارف حشو للتأخير، بدلاً من استخدام تأخير زمني.

OFDEL
    محرف الحشو هو ASCII DEL (0177). إذا لم يُضبط، فمحرف الحشو هو ASCII NUL ('\0'). (لم يُنفذ على لينكس.)

NLDLY
    قناع تأخير السطر الجديد. القيم هي NL0 و NL1. [يتطلب _BSD_SOURCE أو _SVID_SOURCE أو _XOPEN_SOURCE]

CRDLY
    قناع تأخير إرجاع العربة. القيم هي CR0، CR1، CR2، أو CR3. [يتطلب _BSD_SOURCE أو _SVID_SOURCE أو _XOPEN_SOURCE]

TABDLY
    قناع تأخير الجدولة الأفقية. القيم هي TAB0، TAB1، TAB2، TAB3 (أو XTABS، لكن انظر قسم BUGS). قيمة TAB3، أي XTABS، توسع الجداول إلى مسافات (مع توقفات جدولة كل ثمانية أعمدة). [يتطلب _BSD_SOURCE أو _SVID_SOURCE أو _XOPEN_SOURCE]

BSDLY
    قناع تأخير المسح الخلفي. القيم هي BS0 أو BS1. (لم يُنفذ أبدًا.) [يتطلب _BSD_SOURCE أو _SVID_SOURCE أو _XOPEN_SOURCE]

VTDLY
    قناع تأخير الجدولة العمودية. القيم هي VT0 أو VT1.

FFDLY
    قناع تأخير تغذية النموذج. القيم هي FF0 أو FF1. [يتطلب _BSD_SOURCE أو _SVID_SOURCE أو _XOPEN_SOURCE]

ثوابت العلم c_cflag:

CBAUD
    (ليس في POSIX) قناع سرعة الباود (4+1 بت). [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

CBAUDEX
    (ليس في POSIX) قناع سرعة باود إضافي (1 بت)، مُضمن في CBAUD. [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

    (ينص POSIX على أن سرعة الباود تُخزَّن في بنية termios دون تحديد مكانها بدقة، ويوفر الدالتين cfgetispeed() و cfsetispeed() للوصول إليها. تستخدم بعض الأنظمة البتات المحددة بواسطة CBAUD في c_cflag، بينما تستخدم أنظمة أخرى حقولاً منفصلة، مثل sg_ispeed و sg_ospeed.)

CSIZE
    قناع حجم المحرف. القيم هي CS5 أو CS6 أو CS7 أو CS8.

CSTOPB
    يضبط بتّي توقف، بدلاً من بت واحد.

CREAD
    يمكّن المستقبل.

PARENB
    يمكّن توليد التكافؤ عند الإخراج والتحقق من التكافؤ عند الإدخال.

PARODD
    إذا ضُبط، يكون التكافؤ للإدخال والإخراج فرديًا؛ وإلا يُستخدم التكافؤ الزوجي.

HUPCL
    يخفض خطوط تحكم المودم بعد أن يُغلق آخر عملية الجهاز (إنهاء الاتصال).

CLOCAL
    يتجاهل خطوط تحكم المودم.

LOBLK
    (ليس في POSIX) يحجب الإخراج من طبقة شل غير حالية. للاستخدام بواسطة shl (طبقات الشل). (لم يُطبَّق على Linux.)

CIBAUD
    (ليس في POSIX) قناع لسرعات الإدخال. قيم بتات CIBAUD هي نفس قيم بتات CBAUD، مُزاحة لليسار بمقدار IBSHIFT بت. [يتطلب _BSD_SOURCE أو _SVID_SOURCE] (لم يُطبَّق في glibc، مدعوم على Linux عبر ioctls TCGET* و TCSET*؛ انظر ioctl_tty(2))

CMSPAR
    (ليس في POSIX) استخدم تكافؤ "لزق" (علامة/فراغ) (مدعوم على أجهزة تسلسلية معينة): إذا وُضع PARODD، فإن بت التكافؤ يكون دائمًا 1؛ إذا لم يُوضع PARODD، فإن بت التكافؤ يكون دائمًا 0. [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

CRTSCTS
    (ليس في POSIX) فعّل التحكم في التدفق RTS/CTS (عتاد). [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

ثوابت العلم c_lflag:

ISIG
    عند استلام أي من المحارف INTR، QUIT، SUSP، أو DSUSP، يولّد الإشارة المقابلة.

ICANON
    فعّل الوضع القانوني (موصوف أدناه).

XCASE
    (ليس في POSIX؛ غير مدعوم تحت Linux) إذا وُضع ICANON أيضًا، الطرفية تكون أحرف كبيرة فقط. يُحوّل الإدخال إلى أحرف صغيرة، باستثناء المحارف المسبوقة بـ \. عند الإخراج، تُسبق الأحرف الكبيرة بـ \ وتُحوّل الأحرف الصغيرة إلى أحرف كبيرة. [يتطلب _BSD_SOURCE أو _SVID_SOURCE أو _XOPEN_SOURCE]

ECHO
    صدى محارف الإدخال.

ECHOE
    إذا وُضع ICANON أيضًا، يمحو محرف ERASE محرف الإدخال السابق، ويمحو WERASE الكلمة السابقة.

ECHOK
    إذا وُضع ICANON أيضًا، يمحو محرف KILL السطر الحالي.

ECHONL
    إذا وُضع ICANON أيضًا، أصدِ محرف NL حتى لو لم يُوضع ECHO.

ECHOCTL
    (ليس في POSIX) إذا وُضع ECHO أيضًا، تُصدى المحارف الخاصة بالطرفية غير TAB، NL، START، وSTOP كـ ^X، حيث X هو المحرف برمز ASCII أكبر بمقدار 0x40 من المحرف الخاص. على سبيل المثال، المحرف 0x08 (BS) يُصدى كـ ^H. [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

ECHOPRT
    (غير موجود في POSIX) إذا وُضعت ICANON و ECHO أيضًا، تُطبع المحارف أثناء مسحها. [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

ECHOKE
    (غير موجود في POSIX) إذا وُضعت ICANON أيضًا، يُصدى KILL بمسح كل محرف في السطر، كما هو محدد بواسطة ECHOE و ECHOPRT. [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

DEFECHO
    (غير موجود في POSIX) يُصدى فقط عندما تقرأ عملية. (غير مطبق على Linux.)

FLUSHO
    (غير موجود في POSIX؛ غير مدعوم تحت Linux) يُفرغ المخرجات. يُبدّل هذا العلم بكتابة محرف DISCARD. [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

NOFLSH
    عطّل تفريغ طوابير الإدخال والإخراج عند توليد الإشارات لمحارف INT و QUIT و SUSP.

TOSTOP
    أرسل إشارة SIGTTOU إلى مجموعة عملية خلفية تحاول الكتابة إلى طرفيتها المسيطرة.

PENDIN
    (غير موجود في POSIX؛ غير مدعوم تحت Linux) تُعاد طباعة كل المحارف في طابور الإدخال عند قراءة المحرف التالي. (يتعامل bash(1) مع الكتابة المسبقة بهذه الطريقة.) [يتطلب _BSD_SOURCE أو _SVID_SOURCE]

IEXTEN
    فعّل معالجة الإدخال المعرّفة بالتنفيذ. يجب تفعيل هذا العلم، بالإضافة إلى ICANON، لتفسير المحارف الخاصة EOL2 و LNEXT و REPRINT و WERASE، ولتأثير علم IUCLC.

يُعرِّف مصفوفة c_cc المحارف الخاصة بالطرفية. المؤشرات الرمزية (القيم المبدئية) والمعاني هي:

VDISCARD
    (غير موجود في POSIX؛ غير مدعوم تحت Linux؛ 017، SI، Ctrl-O) بدّل: ابدأ/أوقف تجاهل المخرجات المعلقة. يُعرف عند وضع IEXTEN، ثم لا يُمرر كإدخال.

VDSUSP
    (غير موجود في POSIX؛ غير مدعوم تحت لينكس؛ 031، EM، Ctrl-Y) محرف الإيقاف المؤقت المُؤجَّل (DSUSP): يُرسل إشارة SIGTSTP عندما يُقرأ المحرف بواسطة برنامج المستخدم. يُعرَف عند ضبط IEXTEN و ISIG، ويدعم النظام التحكم بالمهام، ثم لا يُمرَّر كمدخل.

VEOF
    (004، EOT، Ctrl-D) محرف نهاية الملف (EOF). بدقة أكثر: يتسبب هذا المحرف في إرسال مخبأة tty المعلَّقة إلى برنامج المستخدم المنتظر دون انتظار نهاية السطر. إذا كان أول محرف في السطر، تُعيد الدالة read(2) في برنامج المستخدم القيمة 0، التي تُشير إلى نهاية الملف. يُعرَف عند ضبط ICANON، ثم لا يُمرَّر كمدخل.

VEOL
    (0، NUL) محرف نهاية سطر إضافي (EOL). يُعرَف عند ضبط ICANON.

VEOL2
    (غير موجود في POSIX؛ 0، NUL) محرف نهاية سطر آخر (EOL2). يُعرَف عند ضبط ICANON.

VERASE
    (0177، DEL، rubout، أو 010، BS، Ctrl-H، أو أيضًا #) محرف المسح (ERASE). يمسح هذا المحرف السابق الذي لم يُمسح بعد، لكنه لا يمسح ما بعد EOF أو بداية السطر. يُعرَف عند ضبط ICANON، ثم لا يُمرَّر كمدخل.

VINTR
    (003، ETX، Ctrl-C، أو أيضًا 0177، DEL، rubout) محرف المقاطعة (INTR). يُرسل إشارة SIGINT. يُعرَف عند ضبط ISIG، ثم لا يُمرَّر كمدخل.

VKILL
    (025، NAK، Ctrl-U، أو Ctrl-X، أو أيضًا @) محرف الحذف (KILL). يمسح هذا المدخلات منذ آخر EOF أو بداية السطر. يُعرَف عند ضبط ICANON، ثم لا يُمرَّر كمدخل.

VLNEXT
    (غير موجود في POSIX؛ 026، SYN، Ctrl-V) المحرف التالي الحرفي (LNEXT). يُقتبس محرف الإدخال التالي، مُجرِّدًا إياه من أي معنى خاص محتمل. يُعرَف عند ضبط IEXTEN، ثم لا يُمرَّر كمدخل.

VMIN
    العدد الأدنى من المحارف للقراءة غير القانونية (MIN).

VQUIT
    (034، FS، Ctrl-\) محرف الخروج (QUIT). يُرسل إشارة SIGQUIT. يُعرَف عند ضبط ISIG، ثم لا يُمرَّر كمدخل.

VREPRINT
    (ليس في POSIX؛ 022، DC2، Ctrl-R) إعادة طباعة المحارف غير المقروءة (REPRINT). يُعرَف عندما يكون ICANON و IEXTEN مضبوطين، ثم لا يُمرر كمدخل.

VSTART
    (021، DC1، Ctrl-Q) محرف البدء (START). يعيد تشغيل المخرجات التي أوقفها محرف الإيقاف. يُعرَف عندما يكون IXON مضبوطًا، ثم لا يُمرر كمدخل.

VSTATUS
    (ليس في POSIX؛ غير مدعوم في لينكس؛ طلب الحالة: 024، DC4، Ctrl-T). محرف الحالة (STATUS). يعرض معلومات الحالة في الطرفية، بما في ذلك حالة عملية المقدمة ومقدار وقت وحدة المعالجة المركزية الذي استهلكته. كما يرسل إشارة SIGINFO (غير مدعومة في لينكس) إلى مجموعة عملية المقدمة.

VSTOP
    (023، DC3، Ctrl-S) محرف الإيقاف (STOP). يوقف المخرجات حتى يُكتب محرف البدء. يُعرَف عندما يكون IXON مضبوطًا، ثم لا يُمرر كمدخل.

VSUSP
    (032، SUB، Ctrl-Z) محرف التعليق (SUSP). يرسل إشارة SIGTSTP. يُعرَف عندما يكون ISIG مضبوطًا، ثم لا يُمرر كمدخل.

VSWTCH
    (ليس في POSIX؛ غير مدعوم في لينكس؛ 0، NUL) محرف التبديل (SWTCH). يُستخدم في System V لتبديل الصدف في طبقات الصدف، سلف التحكم في مهام الصدف.

VTIME
    مهلة بعشرات الثواني للقراءة غير القانونية (TIME).

VWERASE
    (ليس في POSIX؛ 027، ETB، Ctrl-W) مسح الكلمة (WERASE). يُعرَف عندما يكون ICANON و IEXTEN مضبوطين، ثم لا يُمرر كمدخل.

يمكن تعطيل محرف طرفية خاص فردي بضبط قيمة العنصر c_cc المقابل إلى _POSIX_VDISABLE.

قيم الرموز الفرعية أعلاه كلها مختلفة، باستثناء أن VTIME، VMIN قد يكون لهما نفس قيمة VEOL، VEOF، على التوالي. في الوضع غير القانوني، يُستبدل معنى المحرف الخاص بمعنى المهلة. لشرح VMIN و VTIME، انظر وصف الوضع غير القانوني أدناه.

  استرجاع وتغيير إعدادات الطرفية
تسترد tcgetattr() المعاملات المرتبطة بالكائن المشار إليه بـ fd، وتخزنها في بنية termios المشار إليها بـ termios_p. قد تُستدعى هذه الدالة من عملية خلفية؛ ومع ذلك، قد تُغير سِمات الطرفية لاحقًا بواسطة عملية أمامية.

تضبط tcsetattr() المعاملات المرتبطة بالطرفية (ما لم يكن الدعم مطلوبًا من العتاد الأساسي غير المتاح) من بنية termios المشار إليها بـ termios_p. يحدد optional_actions متى تسري التغييرات:

TCSANOW
    يحدث التغيير فورًا.

TCSADRAIN
    يحدث التغيير بعد إرسال كل المخرجات المكتوبة إلى fd. ينبغي استخدام هذا الخيار عند تغيير المعاملات التي تؤثر على المخرجات.

TCSAFLUSH
    يحدث التغيير بعد إرسال كل المخرجات المكتوبة إلى الكائن المشار إليه بـ fd، ويُتخلص من كل المدخلات التي وردت ولكن لم تُقرأ قبل إجراء التغيير.

  الوضع القانوني وغير القانوني
يحدد إعداد العلم القانوني بICANON في c_lflag ما إذا كانت النهاية الطرفية تعمل في الوضع القانوني (بICANON مضبوط) أم الوضع غير القانوني (بICANON غير مضبوط). مبدئيًا، بICANON مضبوط.

في الوضع القانوني:

•   تُتاح المدخلات سطرًا سطرًا. يتوفر سطر المدخلات عند كتابة أحد محددات السطر (NL، EOL، EOL2 ؛ أو EOF في بداية السطر). باستثناء حالة EOF، يُضمن محدد السطر في المخزن المؤقت الذي ترجعه بread(2).

•   تُفعّل تحرير السطر (ERASE، KILL؛ وإذا كان العلم بIEXTEN مضبوطًا: WERASE، REPRINT، LNEXT). ترجع ب read(2). سطرًا واحدًا من المدخلات على الأكثر؛ إذا طلبت بread(2). عدد بايتات أقل مما هو متاح في سطر المدخلات الحالي، فتُقرأ فقط عدد البايتات المطلوبة، وتكون المحارف المتبقية متاحة لاستدعاء بread(2). مستقبلي.

•   الحد الأقصى لطول السطر هو 4096 محرفًا (بما في ذلك محرف السطر الجديد الختامي)؛ تُقتطع الأسطر الأطول من 4096 محرفًا. بعد 4095 محرفًا، تستمر معالجة المدخلات (مثل معالجة بISIG و ECHO*)، ولكن يُتخلص من أي بيانات مدخلات بعد 4095 محرفًا حتى (ولكن ليس بما في ذلك) أي سطر جديد ختامي. يضمن هذا أن النهاية الطرفية يمكنها دائمًا استقبال المزيد من المدخلات حتى يمكن قراءة سطر واحد على الأقل.

في الوضع غير القانوني، تتاح المدخلات فورًا (دون حاجة المستخدم لكتابة محرف محدد سطر)، ولا تُجرى أي معالجة للمدخلات، ويُعطّل تحرير السطر. يقبل المخزن المؤقت للقراءة 4095 محرفًا فقط؛ يوفر هذا المساحة اللازمة لمحرف سطر جديد إذا تحول وضع المدخلات إلى القانوني. تحدد إعدادات MIN (c_cc[VMIN]) وTIME (c_cc[VTIME]) الظروف التي يكتمل فيها ب read(2) ؛ هناك أربع حالات مميزة:

MIN == 0، TIME == 0 (قراءة استقصائية)
    إذا توفرت بيانات، ترجع بread(2) فورًا، مع أقل عدد من البايتات المتاحة أو عدد البايتات المطلوبة. إذا لم تتوفر بيانات، ترجع ب read(2) 0.

MIN > 0، TIME == 0 (قراءة حاجزة)
    تحجز بread(2) حتى تتوفر بايتات MIN، وترجع حتى عدد البايتات المطلوبة.

MIN == 0، TIME > 0 (قراءة مع مهلة)
    يحدد TIME حدًا لمؤقت بعشر الثانية. يُبدأ المؤقت عند استدعاء بread(2). ترجع بread(2) إما عندما يتوفر بايت واحد على الأقل من البيانات، أو عندما ينتهي المؤقت. إذا انتهى المؤقت دون توفر أي مدخلات، ترجع بread(2) 0. إذا كانت البيانات متوفرة بالفعل وقت استدعاء بread(2)، يتصرف الاستدعاء كما لو أن البيانات وردت فورًا بعد الاستدعاء.

MIN > 0، TIME > 0 (قراءة مع مهلة بين البايتات)
    يُحدد TIME حدًا لمؤقت بعشر الثانية. بمجرد أن يصبح البايت الأول من الإدخال متاحًا، يُعاد تشغيل المؤقت بعد استلام كل بايت إضافي. تعود read(2) عند تحقق أي من الشروط التالية:

    •   اُستلم MIN بايت.

    •   ينتهي المؤقت بين البايتات.

    •   تم استلام عدد البايتات المطلوب بواسطة read(2). (لا يُحدد POSIX شرط الإنهاء هذا، وفي بعض التطبيقات الأخرى لا تعود read(2) في هذه الحالة.)

    لأن المؤقت يُبدأ فقط بعد أن يصبح البايت الأول متاحًا، سيُقرأ بايت واحد على الأقل. إذا كانت البيانات متاحة بالفعل وقت استدعاء read(2)، يتصرف الاستدعاء كما لو أن البيانات استُلمت فورًا بعد الاستدعاء.

لا يُحدد POSIX ما إذا كان إعداد علامة حالة الملف O_NONBLOCK له الأولوية على إعدادات MIN وTIME. إذا كان O_NONBLOCK مضبوطًا، قد تعود read(2) في الوضع غير القانوني فورًا، بغض النظر عن إعداد MIN أو TIME. علاوة على ذلك، إذا لم تكن البيانات متاحة، يسمح POSIX لـ read(2) في الوضع غير القانوني بالعودة إما 0، أو -1 مع تعيين errno إلى EAGAIN.

  الوضع الخام
يضبط cfmakeraw() الطرفية على شيء يشبه الوضع "الخام" لمشغل الطرفية القديم الإصدار 7: الإدخال متاح حرفًا بحرف، الصدى معطل، وجميع المعالجة الخاصة لأحرف الإدخال والإخراج للطرفية معطلة. تُضبط سمات الطرفية كما يلي:

    termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
                    | INLCR | IGNCR | ICRNL | IXON);
    termios_p->c_oflag &= ~OPOST;
    termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
    termios_p->c_cflag &= ~(CSIZE | PARENB);
    termios_p->c_cflag |= CS8;

  التحكم في الخط
يرسل tcsendbreak() دفقًا مستمرًا من البتات ذات القيمة صفر لمدة محددة، إذا كانت الطرفية تستخدم إرسال بيانات تسلسلي غير متزامن. إذا كانت duration صفرًا، يُرسل بتات ذات قيمة صفر لمدة 0.25 ثانية على الأقل، ولا تزيد عن 0.5 ثانية. إذا كانت duration غير صفرية، يُرسل بتات ذات قيمة صفر لمدة زمنية محددة بالتطبيق.

إذا كانت الطرفية لا تستخدم إرسال بيانات تسلسلي غير متزامن، تعود tcsendbreak() دون اتخاذ أي إجراء.

ينتظر tcdrain() حتى يُرسل كل الإخراج المكتوب إلى الكائن المشار إليه بواسطة fd.

يتجاهل tcflush() البيانات المكتوبة إلى الكائن المشار إليه بواسطة fd ولكن لم تُرسل، أو البيانات المستلمة ولكن لم تُقرأ، اعتمادًا على قيمة queue_selector:

TCIFLUSH
    يُفرغ البيانات المستلمة ولكن لم تُقرأ.

TCOFLUSH
    يُفرغ البيانات المكتوبة ولكن لم تُرسل.

TCIOFLUSH
    يُفرغ كلاً من البيانات المستلمة ولكن لم تُقرأ، والبيانات المكتوبة ولكن لم تُرسل.

تعلق الدالة tcflow() إرسال أو استقبال البيانات على الكائن المشار إليه بواسطة fd، اعتمادًا على قيمة action:

TCOOFF
    تعلق الإخراج.

TCOON
    تعيد تشغيل الإخراج المعلق.

TCIOFF
    ترسل حرف STOP، الذي يوقف جهاز الطرفية عن إرسال البيانات إلى النظام.

TCION
    ترسل حرف START، الذي يبدأ جهاز الطرفية بإرسال البيانات إلى النظام.

المبدئي عند فتح ملف طرفية هو أن لا يُعلق إدخاله ولا إخراجه.

  سرعة الخط
تُوفر دوال معدل الباود للحصول على قيم معدلات الباود للإدخال والإخراج في بنية termios وتعيينها. لا تسري القيم الجديدة حتى تُستدعى tcsetattr() بنجاح.

تعيين السرعة إلى B0 يوجه المودم إلى "إنهاء الاتصال". قد يُغير معدل البت الفعلي المقابل لـ B38400 باستخدام setserial(8).

تُخزن معدلات الباود للإدخال والإخراج في بنية termios.

ترجع الدالة cfgetospeed() معدل الباود للإخراج المخزن في بنية termios المشار إليها بواسطة termios_p.

تضبط الدالة cfsetospeed() معدل الباود للإخراج المخزن في بنية termios المشار إليها بواسطة termios_p إلى speed، والتي يجب أن تكون إحدى هذه الثوابت:

    B0
    B50
    B75
    B110
    B134
    B150
    B200
    B300
    B600
    B1200
    B1800
    B2400
    B4800
    B9600
    B19200
    B38400
    B57600
    B115200
    B230400
    B460800
    B500000
    B576000
    B921600
    B1000000
    B1152000
    B1500000
    B2000000

تُدعم هذه الثوابت إضافيًا على بنية SPARC:

    B76800
    B153600
    B307200
    B614400

تُدعم هذه الثوابت إضافيًا على البنى غير SPARC:

    B2500000
    B3000000
    B3500000
    B4000000

نظرًا للاختلافات بين البنى، ينبغي للتطبيقات المنقولة التحقق من تعريف ثابت Bnnn معين قبل استخدامه.

يُستخدم معدل الباود الصفري، B0، لإنهاء الاتصال. إذا حُدد B0، فلن تُفعل خطوط تحكم المودم بعد الآن. عادةً، سيفصل هذا الخط. CBAUDEX هو قناع للسرعات التي تتجاوز تلك المعرفة في POSIX.1 (57600 وما فوق). وبالتالي، فإن B57600 & CBAUDEX غير صفري.

يمكن ضبط معدل الباود إلى قيمة غير تلك المعرفة بثوابت Bnnn عبر ioctl TCSETS2؛ انظر ioctl_tty(2).

تُرجع cfgetispeed() معدل الباود المدخل المخزن في بنية termios.

تضبط cfsetispeed() معدل الباود المدخل المخزن في بنية termios إلى speed، والذي يجب تحديده كأحد ثوابت Bnnn المذكورة أعلاه لـ cfsetospeed(). إذا ضُبط معدل الباود المدخل على الثابت الحرفي 0 (وليس الثابت الرمزي B0)، فسيساوي معدل الباود المدخل معدل الباود المخرج.

cfsetspeed() هو امتداد 4.4BSD. يأخذ نفس المعاملات كـ cfsetispeed()، ويضبط السرعة المدخلة والمخرجة معًا.

قيمة الإرجاع
تُرجع cfgetispeed() معدل الباود المدخل المخزن في بنية termios.

تُرجع cfgetospeed() معدل الباود المخرج المخزن في بنية termios.

جميع الدوال الأخرى تُرجع:

0   عند النجاح.

-1  عند الفشل وتضبط errno للإشارة إلى الخطأ.

لاحظ أن tcsetattr() تُرجع النجاح إذا أمكن تنفيذ أي من التغييرات المطلوبة بنجاح. لذلك، عند إجراء تغييرات متعددة، قد يكون من الضروري متابعة هذه الاستدعاء باستدعاء آخر لـ tcgetattr() للتحقق من تنفيذ جميع التغييرات بنجاح.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
tcgetattr(), tcsetattr(), tcdrain(), tcflush(), tcflow(), tcsendbreak(), cfmakeraw(), cfgetispeed(), cfgetospeed(), cfsetispeed(), cfsetospeed(), cfsetspeed() | سلامة الخيوط | MT-Safe

المعايير

tcgetattr()
tcsetattr()
tcsendbreak()
tcdrain()
tcflush()
tcflow()
cfgetispeed()
cfgetospeed()
cfsetispeed()
cfsetospeed()
    POSIX.1-2008.

cfmakeraw()
cfsetspeed()
    BSD.

التاريخ

tcgetattr()
tcsetattr()
tcsendbreak()
tcdrain()
tcflush()
tcflow()
cfgetispeed()
cfgetospeed()
cfsetispeed()
cfsetospeed()
    POSIX.1-2001.

cfmakeraw()
cfsetspeed()
    BSD.

ملاحظات
تحتوي UNIX V7 والعديد من الأنظمة اللاحقة على قائمة بمعدلات الباود حيث بعد القيم B0 حتى B9600 يُوجد الثابتان EXTA، EXTB ("خارجي A" و"خارجي B"). تمدد العديد من الأنظمة القائمة بمعدلات باود أعلى بكثير.

يختلف تأثير المدة غير الصفرية مع tcsendbreak(). تحدد SunOS انقطاعًا لمدة duration * N ثانية، حيث N لا يقل عن 0.25 ولا يزيد عن 0.5. ترسل Linux، AIX، DU، Tru64 انقطاعًا لمدة duration ملي ثانية. تتجاهل FreeBSD وNetBSD وHP-UX وMacOS قيمة duration. تحت Solaris وUnixWare، تتصرف tcsendbreak() مع المدة غير الصفرية مثل tcdrain().

العلل
على بنية Alpha قبل Linux 4.16 (وglibc قبل glibc 2.28)، كانت قيمة XTABS مختلفة عن TAB3 وتجاهلها كود نظام الخط N_TTY لمشغل الطرفية نتيجة لذلك (لأنها لم تكن جزءًا من قناع TABDLY).

انظر أيضًا
reset(1)، setterm(1)، stty(1)، tput(1)، tset(1)، tty(1)، ioctl_console(2)، ioctl_tty(2)، cc_t(3type)، speed_t(3type)، tcflag_t(3type)، setserial(8)

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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