ioctl(2)

الاسم
ioctl - التحكم في الجهاز

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

موجز
#include <sys/ioctl.h>

int ioctl(int fd, unsigned long op, ...);  /* glibc, BSD */
int ioctl(int fd, int op, ...);            /* musl, other UNIX */

الوصف
نداء النظام ioctl() يعالج معاملات الجهاز الأساسية للملفات الخاصة. على وجه الخصوص، يمكن التحكم في العديد من خصائص التشغيل للملفات الخاصة الحرفية (مثل المحطات الطرفية) باستخدام عمليات ioctl(). يجب أن تكون الوسيطة fd واصف ملف مفتوح.

الوسيطة الثانية هي رمز عملية يعتمد على الجهاز. الوسيطة الثالثة هي مؤشر غير منسوب إلى ذاكرة. تقليديًا هي char *argp (من الأيام التي سبقت أن يكون void * صالحًا في C)، وسيتم تسميتها هكذا لهذا النقاش.

تحتوي عملية ioctl() op على ترميز يحدد ما إذا كانت الوسيطة معامل in أو معامل out، وحجم الوسيطة argp بالبايت. توجد الماكرو والتعريفات المستخدمة في تحديد عملية ioctl() op في الملف <sys/ioctl.h>. انظر الملاحظات.

قيمة الإرجاع
عادةً، عند النجاح يتم إرجاع صفر. تستخدم بعض عمليات ioctl() القيمة المعادة كمعامل إخراج وتعيد قيمة غير سالبة عند النجاح. عند الخطأ، يتم إرجاع -1، ويتم تعيين errno للإشارة إلى الخطأ.

الأخطاء

EBADF
    fd ليس واصف ملف صالح.

EFAULT
    يشير argp إلى منطقة ذاكرة غير قابلة للوصول.

EINVAL
    op أو argp غير صالح.

ENOTTY
    fd غير مرتبط بجهاز خاص حرفي.

ENOTTY
    العملية المحددة لا تنطبق على نوع الكائن الذي يشير إليه واصف الملف fd.

الإصدارات
تختلف الوسائط والقيم المعادة ودلالات ioctl() وفقًا لبرنامج تشغيل الجهاز المعني (يُستخدم النداء كحاوية شاملة للعمليات التي لا تتناسب بشكل نظيف مع نموذج الإدخال/الإخراج التدفقي لـ UNIX).

المعايير
لا شيء.

التاريخ
الإصدار 7 من AT&T UNIX يحتوي على
ioctl(int fd, int op, struct sgttyb *argp);
(حيث تم استخدام struct sgttyb تاريخيًا بواسطة stty(2) و gtty(2)، وهو متعدد الأشكال حسب نوع العملية (مثلما سيكون void * لو كان متاحًا)).

يوثق SysIII arg بدون نوع على الإطلاق.

4.3BSD يحتوي على
ioctl(int d, unsigned long op, char *argp);
(مع char * بالمثل بدلاً من void *).

SysVr4 يحتوي على
int ioctl(int fd, int op, ...  /* arg */);

ملاحظات
لاستخدام هذا النداء، يحتاج المرء إلى واصف ملف مفتوح. غالبًا ما يكون لنداء open(2) آثار جانبية غير مرغوب فيها، يمكن تجنبها تحت Linux بإعطائه العلم O_NONBLOCK.

  هيكل ioctl
قيم op لـ Ioctl هي ثوابت 32 بت. من حيث المبدأ، هذه الثوابت عشوائية تمامًا، لكن الناس حاولوا بناء بعض الهيكلية فيها.

الوضع القديم في Linux كان في الغالب ثوابت 16 بت، حيث البايت الأخير هو رقم تسلسلي، والبايت(ات) السابقة تعطي نوعًا يشير إلى برنامج التشغيل. أحيانًا تم استخدام الرقم الرئيسي: 0x03 لـ ioctls HDIO_*، 0x06 لـ ioctls LP*. وأحيانًا تم استخدام حرف أو أكثر من ASCII. على سبيل المثال، TCGETS له قيمة 0x00005401، مع 0x54 = 'T' يشير إلى برنامج تشغيل المحطة الطرفية، و CYGETTIMEOUT له قيمة 0x00435906، مع 0x43 0x59 = 'C' 'Y' يشير إلى برنامج تشغيل cyclades.

لاحقًا (0.98p5) تم بناء المزيد من المعلومات في الرقم. يحتوي على 2 بت اتجاه (00: لا شيء، 01: كتابة، 10: قراءة، 11: قراءة/كتابة) متبوعة بـ 14 بت حجم (تعطي حجم الوسيطة)، متبوعة بنوع 8 بت (يجمع ioctls في مجموعات لغرض مشترك أو برنامج تشغيل مشترك)، ورقم تسلسلي 8 بت.

الماكرو التي تصف هذه الهيكلية موجودة في <asm/ioctl.h> وهي _IO(type,nr) و {_IOR,_IOW,_IOWR}(type,nr,size). تستخدم sizeof(size) لذا فإن size تسمية خاطئة هنا: هذه الوسيطة الثالثة هي نوع بيانات.

لاحظ أن بتات الحجم غير موثوقة جدًا: في كثير من الحالات تكون خاطئة، إما بسبب ماكرو معيبة تستخدم sizeof(sizeof(struct))، أو بسبب قيم قديمة.

وبالتالي، يبدو أن الهيكلية الجديدة أعطت عيوبًا فقط: لا تساعد في التحقق، ولكنها تسبب قيمًا متغيرة للهياكل المختلفة.

انظر أيضًا
execve(2), fcntl(2), ioctl_console(2), ioctl_fat(2), ioctl_fs(2), ioctl_fsmap(2), ioctl_nsfs(2), ioctl_tty(2), ioctl_userfaultfd(2), ioctl_eventpoll(2), open(2), sd(4), tty(4)

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

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

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