.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2006, Michael Kerrisk .\" 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 sem_wait 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم sem_wait, sem_timedwait, sem_trywait \- قفل كمية .SH المكتبة مكتبة مسالك POSIX (\fIlibpthread\fP،\ \fI\-lpthread\fP) .SH موجز .nf \fB#include \fP .P \fBint sem_wait(sem_t *\fP\fIsem\fP\fB);\fP \fBint sem_trywait(sem_t *\fP\fIsem\fP\fB);\fP \fBint sem_timedwait(sem_t *restrict \fP\fIsem\fP\fB,\fP \fB const struct timespec *restrict \fP\fIabs_timeout\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBsem_timedwait\fP(): .nf _POSIX_C_SOURCE >= 200112L .fi .SH الوصف \fBsem_wait\fP() تُنقص (تقفل) الكمية المشار إليها بواسطة \fIsem\fP. إذا كانت قيمة الكمية أكبر من الصفر، فإن النقص يجري، وتعود الدالة فورًا. إذا كانت الكمية حاليًا قيمتها صفر، فإن الاستدعاء يُحجب حتى يصبح من الممكن إجراء النقص (أي ترتفع قيمة الكمية فوق الصفر)، أو يقاطع معالج إشارة الاستدعاء. .P \fBsem_trywait\fP() هي نفس \fBsem_wait\fP()، باستثناء أنه إذا تعذر إجراء النقص فورًا، فإن الاستدعاء يُرجع خطأ (\fIerrno\fP مضبوط على \fBEAGAIN\fP) بدلاً من الحجب. .P \fBsem_timedwait\fP() هي نفس \fBsem_wait\fP()، باستثناء أن \fIabs_timeout\fP يُحدد حدًا لمقدار الوقت الذي يجب أن يُحجب فيه الاستدعاء إذا تعذر إجراء النقص فورًا. وسيطة \fIabs_timeout\fP تُشير إلى بنية \fBtimespec\fP(3) التي تُحدد مهلة مطلقة بالثواني والنانوثواني منذ العصر، 1970\-01\-01 00:00:00 +0000 (UTC). .P إذا كانت المهلة قد انتهت بالفعل بحلول وقت الاستدعاء، ولم يمكن قفل الكمية فورًا، فإن \fBsem_timedwait\fP() تفشل مع خطأ مهلة (\fIerrno\fP مضبوط على \fBETIMEDOUT\fP). .P إذا أمكن إجراء العملية فورًا، فإن \fBsem_timedwait\fP() لا تفشل أبدًا مع خطأ مهلة، بغض النظر عن قيمة \fIabs_timeout\fP. علاوة على ذلك، لا يُفحص صحة \fIabs_timeout\fP في هذه الحالة. .SH "قيمة الإرجاع" كل هذه الدوال تُرجع 0 عند النجاح؛ عند الخطأ، تُترك قيمة الكمية دون تغيير، وتُعاد \-1، ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEAGAIN\fP (\fBsem_trywait\fP()) تعذر إجراء العملية دون حجب (أي الكمية حاليًا قيمتها صفر). .TP \fBEINTR\fP قُطع الاستدعاء بواسطة معالج إشارات؛ انظر \fBsignal\fP(7). .TP \fBEINVAL\fP \fIsem\fP ليس إشارة (semaphore) صالحة. .TP \fBEINVAL\fP (\fBsem_timedwait\fP()) قيمة \fIabs_timeout.tv_nsecs\fP أقل من 0، أو أكبر من أو تساوي 1000 مليون. .TP \fBETIMEDOUT\fP .\" POSIX.1-2001 also allows EDEADLK -- "A deadlock condition .\" was detected", but this does not occur on Linux(?). (\fBsem_timedwait\fP()) انتهت مهلة الاستدعاء قبل أن يمكن قفل الكمية. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBsem_wait\fP(), \fBsem_trywait\fP(), \fBsem_timedwait\fP() T} سلامة الخيوط MT\-Safe .TE .SH المعايير POSIX.1\-2008. .SH التاريخ POSIX.1\-2001. .SH أمثلة البرنامج (التافه نوعًا ما) الموضح أدناه يعمل على كمية غير مسماة. يتوقع البرنامج وسيطتين لسطر الأوامر. تحدد الوسيطة الأولى قيمة ثوانٍ تُستخدم لضبط مؤقت إنذار لتوليد إشارة \fBSIGALRM\fP. يُنفذ هذا المعالج \fBsem_post\fP(3) لزيادة الكمية التي يُنتظر عليها في \fImain()\fP باستخدام \fBsem_timedwait\fP(). تحدد وسيطة سطر الأوامر الثانية طول المهلة، بالثواني، لـ \fBsem_timedwait\fP(). يُظهر التالي ما يحدث في تشغيلين مختلفين للبرنامج: .P .in +4n .EX $\fB ./a.out 2 3\fP About to call sem_timedwait() sem_post() from handler sem_timedwait() succeeded $\fB ./a.out 2 1\fP About to call sem_timedwait() sem_timedwait() timed out .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (sem_wait.c) \& .EX #include #include #include #include #include #include #include #include \& #include \& sem_t sem; \& static void handler(int sig) { write(STDOUT_FILENO, "sem_post() from handler\[rs]n", 24); if (sem_post(&sem) == \-1) { write(STDERR_FILENO, "sem_post() failed\[rs]n", 18); _exit(EXIT_FAILURE); } } \& int main(int argc, char *argv[]) { struct sigaction sa; struct timespec ts; int s; \& if (argc != 3) { fprintf(stderr, "Usage: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& if (sem_init(&sem, 0, 0) == \-1) err(EXIT_FAILURE, "sem_init"); \& /* Establish SIGALRM handler; set alarm timer using argv[1]. */ \& sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGALRM, &sa, NULL) == \-1) err(EXIT_FAILURE, "sigaction"); \& alarm(atoi(argv[1])); \& /* Calculate relative interval as current time plus number of seconds given argv[2]. */ \& if (clock_gettime(CLOCK_REALTIME, &ts) == \-1) err(EXIT_FAILURE, "clock_gettime"); \& ts.tv_sec += atoi(argv[2]); \& printf("%s() about to call sem_timedwait()\[rs]n", __func__); while ((s = sem_timedwait(&sem, &ts)) == \-1 && errno == EINTR) continue; /* Restart if interrupted by handler. */ \& /* Check what happened. */ \& if (s == \-1) { if (errno == ETIMEDOUT) printf("sem_timedwait() timed out\[rs]n"); else perror("sem_timedwait"); } else printf("sem_timedwait() succeeded\[rs]n"); \& exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE); } .EE .\" SRC END .SH "انظر أيضًا" \fBclock_gettime\fP(2), \fBsem_getvalue\fP(3), \fBsem_post\fP(3), \fBtimespec\fP(3), \fBsem_overview\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 .