errno(3)

الاسم
errno - رقم آخر خطأ

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

موجز
#include <errno.h>

الوصف
يُعرّف ملف الرأس <errno.h> المتغير الصحيح errno، الذي تُعيِّنه استدعاءات النظام وبعض دوال المكتبة عند حدوث خطأ للإشارة إلى ما حدث من خطأ.

  errno
قيمة errno ذات دلالة فقط عندما تشير قيمة إرجاع الاستدعاء إلى خطأ (أي -1 من معظم استدعاءات النظام؛ -1 أو NULL من معظم دوال المكتبة)؛ يُسمح لدالة تنجح بـ تغيير errno. لا تُعيِّن أي استدعاء نظام أو دالة مكتبة قيمة errno إلى الصفر أبدًا.

لبعض استدعاءات النظام ودوال المكتبة (مثل getpriority(2))، تكون -1 قيمة إرجاع صالحة عند النجاح. في مثل هذه الحالات، يمكن تمييز الإرجاع الناجح عن إرجاع الخطأ بتعيين errno إلى الصفر قبل الاستدعاء، ثم، إذا أرجع الاستدعاء حالة تشير إلى احتمال حدوث خطأ، يُفحص ما إذا كان errno له قيمة غير صفرية.

يُعرِّف معيار ISO C errno كقيمة يسرى قابلة للتعديل من النوع int، ويجب عدم التصريح عنه صراحةً؛ قد يكون errno ماكروًا. errno محلي الخيط؛ تعيينه في خيط واحد لا يؤثر على قيمته في أي خيط آخر.

  أرقام الأخطاء وأسماؤها
أرقام الأخطاء الصالحة هي جميع الأرقام الموجبة. يُعرّف ملف الرأس <errno.h> أسماء رمزية لكل رقم خطأ محتمل قد يظهر في errno.

يجب أن تكون لجميع أسماء الأخطاء المحددة بواسطة POSIX.1 قيم مميزة، باستثناء EAGAIN و EWOULDBLOCK، اللذين قد يكونان متطابقين. على Linux، هذان الاثنان لهما نفس القيمة على جميع البنى.

تختلف أرقام الأخطاء المقابلة لكل اسم رمزي عبر أنظمة UNIX، وحتى عبر البنى المختلفة على Linux. لذلك، لا تُدرج القيم الرقمية كجزء من قائمة أسماء الأخطاء أدناه. يمكن استخدام الدالتين perror(3) و strerror(3) لتحويل هذه الأسماء إلى رسائل خطأ نصية مقابلة.

على أي نظام Linux معين، يمكن الحصول على قائمة بجميع أسماء الأخطاء الرمزية وأرقام الأخطاء المقابلة باستخدام الأمر errno(1) (جزء من حزمة moreutils):

    $ errno -l;
    EPERM 1 العملية غير مسموح بها (Operation not permitted)
    ENOENT 2 لا يوجد ملف أو دليل كهذا (No such file or directory)
    ESRCH 3 لا توجد عملية كهذه (No such process)
    EINTR 4 استدعاء نظام مقطوع (Interrupted system call)
    EIO 5 خطأ في الإدخال/الإخراج (Input/output error)
    ...

يمكن أيضًا استخدام الأمر errno(1) للبحث عن أرقام وأسماء أخطاء فردية، وللبحث عن الأخطاء باستخدام سلاسل محارف من وصف الخطأ، كما في الأمثلة التالية:

    $ errno 2;
    ENOENT 2 لا يوجد ملف أو دليل كهذا (No such file or directory)
    $ errno ESRCH;
    ESRCH 3 لا توجد عملية كهذه (No such process)
    $ errno -s permission;
    EACCES 13 الإذن مرفوض (Permission denied)

  قائمة أسماء الأخطاء
في قائمة أسماء الأخطاء الرمزية أدناه، تُوسم أسماء مختلفة كما يلي:

POSIX.1-2001
    يُعرّف الاسم بواسطة POSIX.1-2001، ويُعرّف في إصدارات POSIX.1 اللاحقة، ما لم يُذكر خلاف ذلك.

POSIX.1-2008
    يُعرّف الاسم في POSIX.1-2008، لكنه لم يكن موجودًا في معايير POSIX.1 السابقة.

C99 الاسم مُعرَّف بواسطة C99.

أدناه قائمة بأسماء الأخطاء الرمزية المُعرَّفة على لينكس:

E2BIG
    قائمة الوسائط طويلة جدًا (POSIX.1-2001).

EACCES
    الصلاحية مرفوضة (POSIX.1-2001).

EADDRINUSE
    العنوان قيد الاستخدام بالفعل (POSIX.1-2001).

EADDRNOTAVAIL
    العنوان غير متاح (POSIX.1-2001).

EAFNOSUPPORT
    عائلة العنوان غير مدعومة (POSIX.1-2001).

EAGAIN
    المورد غير متاح مؤقتًا (قد يكون نفس قيمة EWOULDBLOCK) (POSIX.1-2001).

EALREADY
    الاتصال قيد التقدم بالفعل (POSIX.1-2001).

EBADE
    تبادل غير صالح.

EBADF
    واصف ملف سيئ (POSIX.1-2001).

EBADFD
    واصف الملف في حالة سيئة.

EBADMSG
    رسالة سيئة (POSIX.1-2001).

EBADR
    واصف طلب غير صالح.

EBADRQC
    رمز طلب غير صالح.

EBADSLT
    فتحة غير صالحة.

EBUSY
    الجهاز أو المورد مشغول (POSIX.1-2001).

ECANCELED
    أُلغيَت العملية (POSIX.1-2001).

ECHILD
    لا توجد عمليات فرعية (POSIX.1-2001).

ECHRNG
    رقم القناة خارج النطاق.

ECOMM
    خطأ في الاتصال عند الإرسال.

ECONNABORTED
    أُجهض الاتصال (POSIX.1-2001).

ECONNREFUSED
    رُفض الاتصال (POSIX.1-2001).

ECONNRESET
    أُعيد تعيين الاتصال (POSIX.1-2001).

EDEADLK
    تجنب الجمود في الموارد (POSIX.1-2001).

EDEADLOCK
    في معظم البنى، مرادف لـ EDEADLK. في بعض البنى (مثل Linux MIPS، PowerPC، SPARC)، هو رمز خطأ منفصل "خطأ جمود قفل الملف".

EDESTADDRREQ
    عنوان الوجهة مطلوب (POSIX.1-2001).

EDOM
    وسيطة الرياضيات خارج نطاق الدالة (POSIX.1، C99).

EDQUOT
    تجاوز حصة القرص (POSIX.1-2001).

EEXIST
    الملف موجود (POSIX.1-2001).

EFAULT
    عنوان سيئ (POSIX.1-2001).

EFBIG
    الملف كبير جدًا (POSIX.1-2001).

EHOSTDOWN
    المُضيف معطَّل.

EHOSTUNREACH
    المُضيف غير قابل للوصول (POSIX.1-2001).

EHWPOISON
    صفحة الذاكرة بها خطأ عتادي.

EIDRM
    المُعرِّف أُزيل (POSIX.1-2001).

EILSEQ
    حرف متعدد البايت أو عريض غير صالح أو ناقص (POSIX.1, C99).

    النص المُعروض هنا هو وصف خطأ glibc؛ في POSIX.1، يُوصف هذا الخطأ بأنه "تسلسل بايت غير قانوني".

EINPROGRESS
    العملية قيد التقدم (POSIX.1-2001).

EINTR
    استدعاء دالة مُقاطَع (POSIX.1-2001); انظر signal(7).

EINVAL
    معامل غير صالح (POSIX.1-2001).

EIO خطأ إدخال/إخراج (POSIX.1-2001).

EISCONN
    المقبس موصول (POSIX.1-2001).

EISDIR
    هو دليل (POSIX.1-2001).

EISNAM
    هو ملف نوع مُسمى.

EKEYEXPIRED
    انتهت صلاحية المفتاح.

EKEYREJECTED
    رُفض المفتاح من الخدمة.

EKEYREVOKED
    سُحب المفتاح.

EL2HLT
    المستوى 2 مُوقَف.

EL2NSYNC
    المستوى 2 غير متزامن.

EL3HLT
    المستوى 3 متوقف.

EL3RST
    المستوى 3 معاد تعيينه.

ELIBACC
    لا يمكن الوصول إلى مكتبة مشتركة مطلوبة.

ELIBBAD
    الوصول إلى مكتبة مشتركة تالفة.

ELIBMAX
    محاولة ربط عدد كبير جدًا من المكتبات المشتركة.

ELIBSCN
    قسم .lib في a.out تالف

ELIBEXEC
    لا يمكن تنفيذ مكتبة مشتركة مباشرة.

ELNRNG
    رقم الرابط خارج النطاق.

ELOOP
    عدد كبير جدًا من مستويات الروابط الرمزية (POSIX.1-2001).

EMEDIUMTYPE
    نوع الوسيط خاطئ.

EMFILE
    ملفات مفتوحة كثيرة جدًا (POSIX.1-2001). يحدث هذا عادةً بسبب تجاوز حد المورد RLIMIT_NOFILE الموصوف في getrlimit(2). يمكن أيضًا أن يحدث بسبب تجاوز الحد المحدد في /proc/sys/fs/nr_open.

EMLINK
    روابط كثيرة جدًا (POSIX.1-2001).

EMSGSIZE
    رسالة طويلة جدًا (POSIX.1-2001).

EMULTIHOP
    محاولة قفزات متعددة (POSIX.1-2001).

ENAMETOOLONG
    اسم ملف طويل جدًا (POSIX.1-2001).

ENETDOWN
    الشبكة معطلة (POSIX.1-2001).

ENETRESET
    اتصال أُبطل بواسطة الشبكة (POSIX.1-2001).

ENETUNREACH
    شبكة غير قابلة للوصول (POSIX.1-2001).

ENFILE
    ملفات مفتوحة كثيرة جدًا في النظام (POSIX.1-2001). في لينكس، ربما يكون هذا نتيجة مواجهة حد /proc/sys/fs/file-max (انظر proc(5)).

ENOANO
    لا يوجد مصعد.

ENOBUFS
    لا توجد مساحة مخزن مؤقت متاحة (POSIX.1 (خيار XSI STREAMS)).

ENODATA
    السمة المسماة غير موجودة، أو العملية ليس لديها وصول إلى هذه السمة؛ انظر xattr(7).

    في POSIX.1-2001 (خيار XSI STREAMS)، وُصف هذا الخطأ بأنه "لا توجد رسالة متاحة في طابور قراءة رأس STREAM".

ENODEV
    لا يوجد جهاز كهذا (POSIX.1-2001).

ENOENT
    لا يوجد ملف أو دليل كهذا (POSIX.1-2001).

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

ENOEXEC
    خطأ تنسيق تنفيذ (POSIX.1-2001).

ENOKEY
    المفتاح المطلوب غير متوفر.

ENOLCK
    لا توجد أقفال متوفرة (POSIX.1-2001).

ENOLINK
    قُطعت الوصلة (POSIX.1-2001).

ENOMEDIUM
    لم يُعثر على وسيط.

ENOMEM
    مساحة غير كافية/لا يمكن تخصيص ذاكرة (POSIX.1-2001).

ENOMSG
    لا توجد رسالة من النوع المطلوب (POSIX.1-2001).

ENONET
    الآلة غير موجودة على الشبكة.

ENOPKG
    الحزمة غير مُثبتة.

ENOPROTOOPT
    البروتوكول غير متوفر (POSIX.1-2001).

ENOSPC
    لا توجد مساحة متبقية على الجهاز (POSIX.1-2001).

ENOSR
    لا توجد موارد STREAM (POSIX.1 (خيار XSI STREAMS)).

ENOSTR
    ليس STREAM (POSIX.1 (خيار XSI STREAMS)).

ENOSYS
    الدالة غير مُطبَّقة (POSIX.1-2001).

ENOTBLK
    جهاز كتلي مطلوب.

ENOTCONN
    المقبس غير موصول (POSIX.1-2001).

ENOTDIR
    ليس دليلاً (POSIX.1-2001).

ENOTEMPTY
    الدليل ليس فارغاً (POSIX.1-2001).

ENOTRECOVERABLE
    الحالة غير قابلة للاسترداد (POSIX.1-2008).

ENOTSOCK
    ليس مقبساً (POSIX.1-2001).

ENOTSUP
    العملية غير مدعومة (POSIX.1-2001).

ENOTTY
    عملية تحكم إدخال/إخراج غير مناسبة (POSIX.1-2001).

ENOTUNIQ
    الاسم ليس فريداً على الشبكة.

ENXIO
    لا يوجد جهاز أو عنوان كهذا (POSIX.1-2001).

EOPNOTSUPP
    العملية غير مدعومة على المقبس (POSIX.1-2001).

    (ENOTSUP و EOPNOTSUPP لهما نفس القيمة في لينكس، ولكن وفقاً لـ POSIX.1 يجب أن تكون قيم الخطأ هذه متميزة.)

EOVERFLOW
    القيمة كبيرة جداً لتُخزَّن في نوع البيانات (POSIX.1-2001).

EOWNERDEAD
    المالك مات (POSIX.1-2008).

EPERM
    العملية غير مسموح بها (POSIX.1-2001).

EPFNOSUPPORT
    عائلة البروتوكول غير مدعومة.

EPIPE
    أنبوب مكسور (POSIX.1-2001).

EPROTO
    خطأ في البروتوكول (POSIX.1-2001).

EPROTONOSUPPORT
    البروتوكول غير مدعوم (POSIX.1-2001).

EPROTOTYPE
    نوع البروتوكول خاطئ للمقبس (POSIX.1-2001).

ERANGE
    النتيجة كبيرة جدًا (POSIX.1, C99).

EREMCHG
    تغير العنوان البعيد.

EREMOTE
    الكائن بعيد.

EREMOTEIO
    خطأ إدخال/إخراج بعيد.

ERESTART
    يجب إعادة تشغيل استدعاء النظام المتقطع.

ERFKILL
    العملية غير ممكنة بسبب قتل الترددات الراديوية.

EROFS
    نظام الملفات للقراءة فقط (POSIX.1-2001).

ESHUTDOWN
    لا يمكن الإرسال بعد إغلاق نقطة نهاية النقل.

ESPIPE
    بحث غير صالح (POSIX.1-2001).

ESOCKTNOSUPPORT
    نوع المقبس غير مدعوم.

ESRCH
    لا توجد عملية كهذه (POSIX.1-2001).

ESTALE
    مقبض ملف قديم (POSIX.1-2001).

    يمكن أن يحدث هذا الخطأ لـ NFS ولأنظمة الملفات الأخرى.

ESTRPIPE
    خطأ أنبوب التدفقات.

ETIME
    انتهى المؤقت (POSIX.1 (خيار XSI STREAMS)).

    (يقول POSIX.1 "مهلة STREAM ioctl(2) ".)

ETIMEDOUT
    انتهت مهلة الاتصال (POSIX.1-2001).

ETOOMANYREFS
    مراجع كثيرة جدًا: لا يمكن الربط.

ETXTBSY
    ملف النص مشغول (POSIX.1-2001).

EUCLEAN
    البنية تحتاج إلى تنظيف.

EUNATCH
    برنامج تشغيل البروتوكول غير موصول.

EUSERS
    مستخدمون كثيرون جدًا.

EWOULDBLOCK
    العملية ستحظر (قد تكون نفس قيمة EAGAIN) (POSIX.1-2001).

EXDEV
    رابط عبر الأجهزة غير صالح (POSIX.1-2001).

EXFULL
    التبادل ممتلئ.

ملاحظات
خطأ شائع هو القيام بـ

    if (somecall() == -1) {
        printf("somecall() failed\n");
        if (errno == ...) { ...; }
    }

حيث لم يعد errno بحاجة إلى الاحتفاظ بالقيمة التي كانت عليه عند العودة من somecall() (أي، قد تم تغييرها بواسطة printf(3)). إذا كان يجب الحفاظ على قيمة errno عبر استدعاء مكتبة، فيجب حفظها:

    if (somecall() == -1) {
        int errsv = errno;
        printf("somecall() failed\n");
        if (errsv == ...) { ...; }
    }

لاحظ أن واجهات برمجة تطبيقات خيوط POSIX لا تضبط errno عند الخطأ. بدلاً من ذلك، عند الفشل تُرجع رقم خطأ كنتيجة للدالة. تحمل أرقام الأخطاء هذه نفس معاني أرقام الأخطاء المُرجعة في errno بواسطة واجهات برمجة تطبيقات أخرى.

على بعض الأنظمة القديمة، لم يكن <errno.h> موجوداً أو لم يُصرّح عن errno، لذا كان من الضروري التصريح عن errno يدوياً (أي extern int errno). لا تفعل هذا. لقد توقف عن كونه ضرورياً منذ زمن بعيد، وسيُسبب مشاكل مع الإصدارات الحديثة من مكتبة C.

انظر أيضًا
errno(1), err(3), error(3), perror(3), strerror(3)

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

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

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