.\" -*- coding: UTF-8 -*- .\" Copyright 1993, Giorgio Ciucci .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH semop 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم semop, semtimedop \- عمليات الإشارات (semaphore) لنظام V .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint semop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, size_t \fP\fInsops\fP\fB);\fP \fBint semtimedop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, size_t \fP\fInsops\fP\fB,\fP \fB const struct timespec *_Nullable \fP\fItimeout\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBsemtimedop\fP(): .nf _GNU_SOURCE .fi .SH الوصف كل إشارة في مجموعة إشارات System\ V لها القيم المرتبطة التالية: .P .in +4n .EX unsigned short semval; /* semaphore value */ unsigned short semzcnt; /* # waiting for zero */ unsigned short semncnt; /* # waiting for increase */ pid_t sempid; /* PID of process that last modified the semaphore value */ .EE .in .P \fBsemop\fP() ينفذ عمليات على إشارات محددة في المجموعة المشار إليها بواسطة \fIsemid\fP. كل عنصر من عناصر \fInsops\fP في المصفوفة المشار إليها بواسطة \fIsops\fP هو بنية تحدد عملية سيتم تنفيذها على إشارة واحدة. عناصر هذه البنية من النوع \fIstruct sembuf\fP، وتحتوي على الأعضاء التالية: .P .in +4n .EX unsigned short sem_num; /* semaphore number */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ .EE .in .P الأعلام المعترف بها في \fIsem_flg\fP هي \fBIPC_NOWAIT\fP و \fBSEM_UNDO\fP. إذا حددت عملية \fBSEM_UNDO\fP، فسيتم التراجع عنها آليًا عند إنهاء العملية. .P مجموعة العمليات الموجودة في \fIsops\fP تُنفذ بترتيب \fIالمصفوفة\fP، و\fIبشكل ذري\fP، أي أن العمليات تُنفذ إما كوحدة كاملة، أو لا تُنفذ على الإطلاق. يعتمد سلوك استدعاء النظام إذا لم يمكن تنفيذ جميع العمليات فورًا على وجود علم \fBIPC_NOWAIT\fP في حقول \fIsem_flg\fP الفردية، كما هو مذكور أدناه. .P كل عملية تُنفذ على الإشارة رقم \fIsem_num\fP من مجموعة الإشارات، حيث تُرقم الإشارة الأولى في المجموعة بالرقم 0. هناك ثلاثة أنواع من العمليات، يتم تمييزها بقيمة \fIsem_op\fP. .P إذا كان \fIsem_op\fP عددًا صحيحًا موجبًا، تضيف العملية هذه القيمة إلى قيمة الإشارة (\fIsemval\fP). علاوة على ذلك، إذا تم تحديد \fBSEM_UNDO\fP لهذه العملية، يطرح النظام قيمة \fIsem_op\fP من قيمة تعديل الإشارة (\fIsemadj\fP) لهذه الإشارة. يمكن لهذه العملية أن تستمر دائمًا\[em]فهي لا تجبر الخيط على الانتظار أبدًا. يجب أن تمتلك العملية المستدعية صلاحية التعديل على مجموعة الإشارات. .P إذا كان \fIsem_op\fP صفرًا، يجب أن تمتلك العملية صلاحية القراءة على مجموعة الإشارات. هذه عملية "انتظار للصفر": إذا كان \fIsemval\fP صفرًا، يمكن للعملية أن تستمر فورًا. خلاف ذلك، إذا تم تحديد \fBIPC_NOWAIT\fP في \fIsem_flg\fP، يفشل \fBsemop\fP() مع تعيين \fIerrno\fP إلى \fBEAGAIN\fP (ولا يتم تنفيذ أي من العمليات في \fIsops\fP). خلاف ذلك، يتم زيادة \fIsemzcnt\fP (عدد الخيوط المنتظرة حتى تصبح قيمة هذه الإشارة صفرًا) بمقدار واحد وينام الخيط حتى يحدث أحد الأمور التالية: .IP \[bu] 3 تصبح \fIsemval\fP 0، وعندها يتم تقليل قيمة \fIsemzcnt\fP. .IP \[bu] تتم إزالة مجموعة الإشارات: يفشل \fBsemop\fP()، مع تعيين \fIerrno\fP إلى \fBEIDRM\fP. .IP \[bu] يلتقط الخيط المستدعي إشارة: يتم تقليل قيمة \fIsemzcnt\fP ويفشل \fBsemop\fP()، مع تعيين \fIerrno\fP إلى \fBEINTR\fP. .P إذا كان \fIsem_op\fP أقل من الصفر، يجب أن تمتلك العملية صلاحية التعديل على مجموعة الإشارات. إذا كانت \fIsemval\fP أكبر من أو تساوي القيمة المطلقة لـ \fIsem_op\fP، يمكن للعملية أن تستمر فورًا: تُطرح القيمة المطلقة لـ \fIsem_op\fP من \fIsemval\fP، وإذا تم تحديد \fBSEM_UNDO\fP لهذه العملية، يضيف النظام القيمة المطلقة لـ \fIsem_op\fP إلى قيمة تعديل الإشارة (\fIsemadj\fP) لهذه الإشارة. إذا كانت القيمة المطلقة لـ \fIsem_op\fP أكبر من \fIsemval\fP، وتم تحديد \fBIPC_NOWAIT\fP في \fIsem_flg\fP، يفشل \fBsemop\fP()، مع تعيين \fIerrno\fP إلى \fBEAGAIN\fP (ولا يتم تنفيذ أي من العمليات في \fIsops\fP). خلاف ذلك، يتم زيادة \fIsemncnt\fP (عداد الخيوط المنتظرة لزيادة قيمة هذه الإشارة) بمقدار واحد وينام الخيط حتى يحدث أحد الأمور التالية: .IP \[bu] 3 تصبح \fIsemval\fP أكبر من أو تساوي القيمة المطلقة لـ \fIsem_op\fP: تستمر العملية الآن، كما هو موصوف أعلاه. .IP \[bu] تتم إزالة مجموعة الإشارات من النظام: يفشل \fBsemop\fP()، مع تعيين \fIerrno\fP إلى \fBEIDRM\fP. .IP \[bu] يلتقط الخيط المستدعي إشارة: يتم تقليل قيمة \fIsemncnt\fP ويفشل \fBsemop\fP()، مع تعيين \fIerrno\fP إلى \fBEINTR\fP. .P .\" and .\" .I sem_ctime عند الإكمال بنجاح، يتم تعيين قيمة \fIsempid\fP لكل إشارة محددة في المصفوفة المشار إليها بواسطة \fIsops\fP إلى معرف عملية المستدعي. بالإضافة إلى ذلك، يتم تعيين \fIsem_otime\fP إلى الوقت الحالي. .SS semtimedop() يتصرف \fBsemtimedop\fP() بشكل مماثل لـ \fBsemop\fP() باستثناء أنه في الحالات التي ينام فيها الخيط المستدعي، تكون مدة هذا النوم محدودة بمقدار الوقت المنقضي المحدد بواسطة بنية \fItimespec\fP التي يُمرر عنوانها في وسيط \fItimeout\fP. (سيتم تقريب فترة النوم هذه إلى دقة ساعة النظام، وتأخيرات جدولة النواة تعني أن الفترة قد تتجاوز بمقدار صغير.) إذا تم الوصول إلى الحد الزمني المحدد، يفشل \fBsemtimedop\fP() مع تعيين \fIerrno\fP إلى \fBEAGAIN\fP (ولا يتم تنفيذ أي من العمليات في \fIsops\fP). إذا كان وسيط \fItimeout\fP هو NULL، فإن \fBsemtimedop\fP() يتصرف تمامًا مثل \fBsemop\fP(). .P لاحظ أنه إذا تمت مقاطعة \fBsemtimedop\fP() بواسطة إشارة، مما يتسبب في فشل الاستدعاء مع الخطأ \fBEINTR\fP، تظل محتويات \fItimeout\fP دون تغيير. .SH "قيمة الإرجاع" عند النجاح، يعيد \fBsemop\fP() و \fBsemtimedop\fP() القيمة 0. عند الفشل، يعيدان القيمة \-1، ويضبطان \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBE2BIG\fP الوسيط \fInsops\fP أكبر من \fBSEMOPM\fP، وهو الحد الأقصى لعدد العمليات المسموح بها لكل استدعاء نظام. .TP \fBEACCES\fP لا تمتلك العملية المستدعية الصلاحيات المطلوبة لتنفيذ عمليات الإشارات المحددة، ولا تمتلك القدرة \fBCAP_IPC_OWNER\fP في مساحة اسم المستخدم التي تحكم مساحة اسم IPC الخاصة بها. .TP \fBEAGAIN\fP لم تتمكن عملية من الاستمرار فورًا وتم تحديد \fBIPC_NOWAIT\fP في \fIsem_flg\fP أو انتهى الحد الزمني المحدد في \fItimeout\fP. .TP \fBEFAULT\fP عنوان محدد في وسيط \fIsops\fP أو \fItimeout\fP غير قابل للوصول. .TP \fBEFBIG\fP لبعض العمليات، قيمة \fIsem_num\fP أقل من 0 أو أكبر من أو تساوي عدد الإشارات في المجموعة. .TP \fBEIDRM\fP حُذفت مجموعة السيمافور. .TP \fBEINTR\fP أثناء الحظر في استدعاء النظام هذا، التقط الخيط إشارة؛ انظر \fBsignal\fP(7). .TP \fBEINVAL\fP مجموعة السيمافور غير موجودة، أو \fIsemid\fP أقل من الصفر، أو \fInsops\fP له قيمة غير موجبة. .TP \fBENOMEM\fP يحدد \fIsem_flg\fP لبعض العمليات \fBSEM_UNDO\fP ولا يمتلك النظام ذاكرة كافية لتخصيص بنية التراجع. .TP \fBERANGE\fP بالنسبة لبعض العمليات، \fIsem_op+semval\fP أكبر من \fBSEMVMX\fP، القيمة القصوى المعتمدة على التنفيذ لـ \fIsemval\fP. .SH المعايير POSIX.1\-2024. .SH التاريخ .TP \fBsemop\fP() SVr4, POSIX.1\-2001. .TP \fBsemtimedop\fP() .\" SVr4 documents additional error conditions EINVAL, EFBIG, ENOSPC. SVr4، لينكس 2.5.52 (مُعاد توجيهه إلى لينكس 2.4.22)، glibc 2.3.3. .SH ملاحظات لا تُورث بنى \fIsem_undo\fP لعملية ما إلى الطفل الناتج عن \fBfork\fP(2)، ولكنها تُورث عبر استدعاء نظام \fBexecve\fP(2). .P لا يُعاد تشغيل \fBsemop\fP() آليًا أبدًا بعد مقاطعته بواسطة معالج إشارة، بغض النظر عن إعداد علامة \fBSA_RESTART\fP عند إنشاء معالج إشارة. .P قيمة تعديل السيمافور (\fIsemadj\fP) هي عدد صحيح لكل عملية ولكل سيمافور، وهو المجموع المنفي لجميع العمليات المنفذة على سيمافور مع تحديد علامة \fBSEM_UNDO\fP. تمتلك كل عملية قائمة من قيم \fIsemadj\fP\[em]قيمة واحدة لكل سيمافور عملت عليه باستخدام \fBSEM_UNDO\fP. عندما تنتهي عملية، تُضاف كل قيمة من قيم \fIsemadj\fP الخاصة بكل سيمافور إلى السيمافور المقابل، مما يلغي تأثير عمليات تلك العملية على السيمافور (ولكن انظر الأخطاء أدناه). عندما تُضبط قيمة السيمافور مباشرة باستخدام طلب \fBSETVAL\fP أو \fBSETALL\fP إلى \fBsemctl\fP(2)، تُمسح قيم \fIsemadj\fP المقابلة في جميع العمليات. تسمح علامة \fBclone\fP(2) \fBCLONE_SYSVSEM\fP لأكثر من عملية بمشاركة قائمة \fIsemadj\fP؛ انظر \fBclone\fP(2) للتفاصيل. .P يمكن استرداد قيم \fIsemval\fP و \fIsempid\fP و \fIsemzcnt\fP و \fIsemnct\fP للسيمافور باستخدام استدعاءات \fBsemctl\fP(2) المناسبة. .SS "حدود السيمافور" تؤثر الحدود التالية على موارد مجموعة السيمافور على استدعاء \fBsemop\fP(): .TP \fBSEMOPM\fP .\" commit e843e7d2c88b7db107a86bd2c7145dc715c058f4 .\" This /proc file is not available in Linux 2.2 and earlier -- MTK .\" See comment in Linux 3.19 source file include/uapi/linux/sem.h الحد الأقصى لعدد العمليات المسموح بها لاستدعاء \fBsemop\fP() واحد. قبل لينكس 3.19، كانت القيمة المبدئية لهذا الحد 32. منذ لينكس 3.19، القيمة المبدئية هي 500. على لينكس، يمكن قراءة هذا الحد وتعديله عبر الحقل الثالث من \fI/proc/sys/kernel/sem\fP. \fIملاحظة\fP: لا ينبغي رفع هذا الحد فوق 1000، بسبب خطر فشل \fBsemop\fP() بسبب تجزئة ذاكرة النواة عند تخصيص الذاكرة لنسخ مصفوفة \fIsops\fP. .TP \fBSEMVMX\fP القيمة القصوى المسموح بها لـ \fIsemval\fP: معتمدة على التنفيذ (32767). .P لا يمتلك التنفيذ حدودًا جوهرية للقيمة القصوى للتعديل عند الخروج (\fBSEMAEM\fP)، والحد الأقصى لعدد بنى التراجع على مستوى النظام (\fBSEMMNU\fP)، ومعاملات النظام للحد الأقصى لعدد إدخالات التراجع لكل عملية. .SH العلل عندما تنتهي عملية، تُستخدم مجموعة بنى \fIsemadj\fP المرتبطة بها لإلغاء تأثير جميع عمليات السيمافور التي نفذتها مع علامة \fBSEM_UNDO\fP. يثير هذا صعوبة: إذا أدى واحد (أو أكثر) من تعديلات السيمافور هذه إلى محاولة تقليل قيمة السيمافور إلى ما دون الصفر، فماذا يجب أن يفعل التنفيذ؟ أحد الأساليب الممكنة هو الحظر حتى يمكن تنفيذ جميع تعديلات السيمافور. هذا غير مرغوب فيه لأنه قد يجبر إنهاء العملية على الحظر لفترات طويلة بشكل تعسفي. احتمال آخر هو تجاهل تعديلات السيمافور هذه تمامًا (مشابه إلى حد ما للفشل عند تحديد \fBIPC_NOWAIT\fP لعملية سيمافور). يتبنى لينكس أسلوبًا ثالثًا: تقليل قيمة السيمافور قدر الإمكان (أي إلى الصفر) والسماح بإنهاء العملية فورًا. .P .\" The bug report: .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110260821123863&w=2 .\" the fix: .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110261701025794&w=2 في لينكس 2.6.x، x <= 10، يوجد خطأ يمنع في بعض الظروف إيقاظ خيط ينتظر أن تصبح قيمة السيمافور صفرًا عندما تصبح القيمة صفرًا بالفعل. أُصلح هذا الخطأ في لينكس 2.6.11. .SH أمثلة يستخدم مقطع الكود التالي \fBsemop\fP() للانتظار ذريًا حتى تصبح قيمة السيمافور 0 صفرًا، ثم زيادة قيمة السيمافور بمقدار واحد. .P .in +4n .EX struct sembuf sops[2]; int semid; \& /* Code to set \f[I]semid\fR omitted */ \& sops[0].sem_num = 0; /* Operate on semaphore 0 */ sops[0].sem_op = 0; /* Wait for value to equal 0 */ sops[0].sem_flg = 0; \& sops[1].sem_num = 0; /* Operate on semaphore 0 */ sops[1].sem_op = 1; /* Increment value by one */ sops[1].sem_flg = 0; \& if (semop(semid, sops, 2) == \-1) { perror("semop"); exit(EXIT_FAILURE); } .EE .in .P يمكن العثور على مثال إضافي لاستخدام \fBsemop\fP() في \fBshmop\fP(2). .SH "انظر أيضًا" \fBclone\fP(2)، \fBsemctl\fP(2)، \fBsemget\fP(2)، \fBsigaction\fP(2)، \fBcapabilities\fP(7)، \fBsem_overview\fP(7)، \fBsysvipc\fP(7)، \fBtime\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .