table of contents
| signal-safety(7) | Miscellaneous Information Manual | signal-safety(7) |
الاسم¶
signal-safety - دوال آمنة من الإشارات غير المتزامنة
الوصف¶
الدالة الآمنة من الإشارات غير المتزامنة هي دالة يمكن استدعاؤها بأمان من داخل معالج إشارة. العديد من الدوال ليست آمنة من الإشارات غير المتزامنة. على وجه الخصوص، الدوال غير القابلة لإعادة الدخول غير آمنة بشكل عام للاستدعاء من معالج إشارة.
يمكن فهم أنواع المشكلات التي تجعل الدالة غير آمنة بسرعة عند النظر في تنفيذ مكتبة stdio، التي جميع دوالها ليست آمنة من الإشارات غير المتزامنة.
عند تنفيذ الإدخال/الإخراج المخزن على ملف، يجب على دوال stdio الحفاظ على مخزن بيانات مخصص بشكل ثابت مع عدادات ومؤشرات (أو مؤشرات) مرتبطة تسجل كمية البيانات والموضع الحالي في المخزن. افترض أن البرنامج الرئيسي في منتصف استدعاء لدالة stdio مثل printf(3) حيث تم تحديث المخزن والمتغيرات المرتبطة جزئيًا. إذا تم، في تلك اللحظة، مقاطعة البرنامج بواسطة معالج إشارة يستدعي أيضًا printf(3)، فإن الاستدعاء الثاني لـ printf(3) سيعمل على بيانات غير متناسقة، مع نتائج غير متوقعة.
لتجنب المشكلات مع الدوال غير الآمنة، هناك خياران محتملان:
- (أ)
- تأكد من أن (1) معالج الإشارة يستدعي فقط دوال آمنة من الإشارات غير المتزامنة، و(2) معالج الإشارة نفسه قابل لإعادة الدخول فيما يتعلق بالمتغيرات العامة في البرنامج الرئيسي.
- (ب)
- احجب تسليم الإشارة في البرنامج الرئيسي عند استدعاء دوال غير آمنة أو العمل على بيانات عامة يتم الوصول إليها أيضًا بواسطة معالج الإشارة.
بشكل عام، الخيار الثاني صعب في البرامج من أي تعقيد، لذلك يتم اتخاذ الخيار الأول.
يحدد POSIX.1 مجموعة من الدوال التي يجب على التنفيذ جعلها آمنة من الإشارات غير المتزامنة. (قد يوفر التنفيذ تطبيقات آمنة لدوال إضافية، ولكن هذا غير مطلوب بواسطة المعيار وقد لا توفر التطبيقات الأخرى نفس الضمانات.)
بشكل عام، الدالة آمنة من الإشارات غير المتزامنة إما لأنها قابلة لإعادة الدخول أو لأنها ذرية فيما يتعلق بالإشارات (أي، لا يمكن مقاطعة تنفيذها بواسطة معالج إشارة).
مجموعة الدوال المطلوب أن تكون آمنة من الإشارات غير المتزامنة بواسطة POSIX.1 موضحة في الجدول التالي. الدوال غير الملحوظة بخلاف ذلك كانت مطلوبة لتكون آمنة من الإشارات غير المتزامنة في POSIX.1-2001؛ يوضح الجدول التغييرات في المعايير اللاحقة.
| الدالة | ملاحظات |
| abort(3) | أضيف في POSIX.1-2001 TC1 |
| accept(2) | |
| access(2) | |
| aio_error(3) | |
| aio_return(3) | |
| aio_suspend(3) | انظر الملاحظات أدناه |
| alarm(2) | |
| bind(2) | |
| cfgetispeed(3) | |
| cfgetospeed(3) | |
| cfsetispeed(3) | |
| cfsetospeed(3) | |
| chdir(2) | |
| chmod(2) | |
| chown(2) | |
| clock_gettime(2) | |
| close(2) | |
| connect(2) | |
| creat(2) | |
| dup(2) | |
| dup2(2) | |
| execl(3) | أُضيف في POSIX.1-2008؛ انظر الملاحظات أدناه |
| execle(3) | انظر الملاحظات أدناه |
| execv(3) | أُضيف في POSIX.1-2008 |
| execve(2) | |
| _exit(2) | |
| _Exit(2) | |
| faccessat(2) | أُضيف في POSIX.1-2008 |
| fchdir(2) | أُضيف في POSIX.1-2008 TC1 |
| fchmod(2) | |
| fchmodat(2) | أُضيف في POSIX.1-2008 |
| fchown(2) | |
| fchownat(2) | أُضيف في POSIX.1-2008 |
| fcntl(2) | |
| fdatasync(2) | |
| fexecve(3) | أُضيف في POSIX.1-2008 |
| ffs(3) | أُضيف في POSIX.1-2008 TC2 |
| _Fork(3) | |
| fstat(2) | |
| fstatat(2) | أُضيف في POSIX.1-2008 |
| fsync(2) | |
| ftruncate(2) | |
| futimens(3) | أُضيف في POSIX.1-2008 |
| getegid(2) | |
| geteuid(2) | |
| getgid(2) | |
| getgroups(2) | |
| getpeername(2) | |
| getpgrp(2) | |
| getpid(2) | |
| getppid(2) | |
| getsockname(2) | |
| getsockopt(2) | |
| getuid(2) | |
| htonl(3) | أُضيف في POSIX.1-2008 TC2 |
| htons(3) | أُضيف في POSIX.1-2008 TC2 |
| kill(2) | |
| link(2) | |
| linkat(2) | أُضيف في POSIX.1-2008 |
| listen(2) | |
| longjmp(3) | أُضيف في POSIX.1-2008 TC2؛ انظر الملاحظات أدناه |
| lseek(2) | |
| lstat(2) | |
| memccpy(3) | أُضيف في POSIX.1-2008 TC2 |
| memchr(3) | أُضيف في POSIX.1-2008 TC2 |
| memcmp(3) | أُضيف في POSIX.1-2008 TC2 |
| memcpy(3) | أُضيف في POSIX.1-2008 TC2 |
| memmove(3) | أُضيف في POSIX.1-2008 TC2 |
| memset(3) | أُضيف في POSIX.1-2008 TC2 |
| mkdir(2) | |
| mkdirat(2) | أُضيف في POSIX.1-2008 |
| mkfifo(3) | |
| mkfifoat(3) | أُضيف في POSIX.1-2008 |
| mknod(2) | أُضيف في POSIX.1-2008 |
| mknodat(2) | أُضيف في POSIX.1-2008 |
| ntohl(3) | أُضيف في POSIX.1-2008 TC2 |
| ntohs(3) | أُضيف في POSIX.1-2008 TC2 |
| open(2) | |
| openat(2) | أُضيف في POSIX.1-2008 |
| pause(2) | |
| pipe(2) | |
| poll(2) | |
| posix_trace_event(3) | |
| pselect(2) | |
| pthread_kill(3) | أُضيف في POSIX.1-2008 TC1 |
| pthread_self(3) | أُضيف في POSIX.1-2008 TC1 |
| pthread_sigmask(3) | أُضيف في POSIX.1-2008 TC1 |
| raise(3) | |
| read(2) | |
| readlink(2) | |
| readlinkat(2) | أُضيف في POSIX.1-2008 |
| recv(2) | |
| recvfrom(2) | |
| recvmsg(2) | |
| rename(2) | |
| renameat(2) | أُضيف في POSIX.1-2008 |
| rmdir(2) | |
| select(2) | |
| sem_post(3) | |
| send(2) | |
| sendmsg(2) | |
| sendto(2) | |
| setgid(2) | |
| setpgid(2) | |
| setsid(2) | |
| setsockopt(2) | |
| setuid(2) | |
| shutdown(2) | |
| sigaction(2) | |
| sigaddset(3) | |
| sigdelset(3) | |
| sigemptyset(3) | |
| sigfillset(3) | |
| sigismember(3) | |
| siglongjmp(3) | أُضيف في POSIX.1-2008 TC2؛ انظر الملاحظات أدناه |
| signal(2) | |
| sigpause(3) | |
| sigpending(2) | |
| sigprocmask(2) | |
| sigqueue(2) | |
| sigset(3) | |
| sigsuspend(2) | |
| sleep(3) | |
| sockatmark(3) | أُضيف في POSIX.1-2001 TC2 |
| socket(2) | |
| socketpair(2) | |
| stat(2) | |
| stpcpy(3) | أُضيف في POSIX.1-2008 TC2 |
| stpncpy(3) | أُضيف في POSIX.1-2008 TC2 |
| strcat(3) | أُضيف في POSIX.1-2008 TC2 |
| strchr(3) | أُضيف في POSIX.1-2008 TC2 |
| strcmp(3) | أُضيف في POSIX.1-2008 TC2 |
| strcpy(3) | أُضيف في POSIX.1-2008 TC2 |
| strcspn(3) | أُضيف في POSIX.1-2008 TC2 |
| strlen(3) | أُضيف في POSIX.1-2008 TC2 |
| strncat(3) | أُضيف في POSIX.1-2008 TC2 |
| strncmp(3) | أُضيف في POSIX.1-2008 TC2 |
| strncpy(3) | أُضيف في POSIX.1-2008 TC2 |
| strnlen(3) | أُضيف في POSIX.1-2008 TC2 |
| strpbrk(3) | أُضيف في POSIX.1-2008 TC2 |
| strrchr(3) | أُضيف في POSIX.1-2008 TC2 |
| strspn(3) | أُضيف في POSIX.1-2008 TC2 |
| strstr(3) | أُضيف في POSIX.1-2008 TC2 |
| strtok_r(3) | أُضيف في POSIX.1-2008 TC2 |
| symlink(2) | |
| symlinkat(2) | أُضيف في POSIX.1-2008 |
| tcdrain(3) | |
| tcflow(3) | |
| tcflush(3) | |
| tcgetattr(3) | |
| tcgetpgrp(3) | |
| tcsendbreak(3) | |
| tcsetattr(3) | |
| tcsetpgrp(3) | |
| time(2) | |
| timer_getoverrun(2) | |
| timer_gettime(2) | |
| timer_settime(2) | |
| times(2) | |
| umask(2) | |
| uname(2) | |
| unlink(2) | |
| unlinkat(2) | أُضيف في POSIX.1-2008 |
| utime(2) | |
| utimensat(2) | أُضيف في POSIX.1-2008 |
| utimes(2) | أُضيف في POSIX.1-2008 |
| wait(2) | |
| waitpid(2) | |
| wcpcpy(3) | أُضيف في POSIX.1-2008 TC2 |
| wcpncpy(3) | أُضيف في POSIX.1-2008 TC2 |
| wcscat(3) | أُضيف في POSIX.1-2008 TC2 |
| wcschr(3) | أُضيف في POSIX.1-2008 TC2 |
| wcscmp(3) | أُضيف في POSIX.1-2008 TC2 |
| wcscpy(3) | أُضيف في POSIX.1-2008 TC2 |
| wcscspn(3) | أُضيف في POSIX.1-2008 TC2 |
| wcslen(3) | أُضيف في POSIX.1-2008 TC2 |
| wcsncat(3) | أُضيف في POSIX.1-2008 TC2 |
| wcsncmp(3) | أُضيف في POSIX.1-2008 TC2 |
| wcsncpy(3) | أُضيف في POSIX.1-2008 TC2 |
| wcsnlen(3) | أُضيف في POSIX.1-2008 TC2 |
| wcspbrk(3) | أُضيف في POSIX.1-2008 TC2 |
| wcsrchr(3) | أُضيف في POSIX.1-2008 TC2 |
| wcsspn(3) | أُضيف في POSIX.1-2008 TC2 |
| wcsstr(3) | أُضيف في POSIX.1-2008 TC2 |
| wcstok(3) | أُضيف في POSIX.1-2008 TC2 |
| wmemchr(3) | أُضيف في POSIX.1-2008 TC2 |
| wmemcmp(3) | أُضيف في POSIX.1-2008 TC2 |
| wmemcpy(3) | أُضيف في POSIX.1-2008 TC2 |
| wmemmove(3) | أُضيف في POSIX.1-2008 TC2 |
| wmemset(3) | أُضيف في POSIX.1-2008 TC2 |
| write(2) |
ملاحظات:
- •
- طلبت POSIX.1-2001 و POSIX.1-2001 TC2 أن تكون الدوال fpathconf(3) و pathconf(3) و sysconf(3) آمنة للإشارات غير المتزامنة، لكن هذا الشرط أُزيل في POSIX.1-2008.
- •
- إذا قاطع معالج الإشارة تنفيذ دالة غير آمنة، وأنهى المعالج عبر استدعاء longjmp(3) أو siglongjmp(3) واستدعى البرنامج لاحقًا دالة غير آمنة، فإن سلوك البرنامج غير محدد.
- •
- قد تؤدي معالجات الإشارات غير المتزامنة التي تستدعي دوالًا هي نقاط إلغاء وتتداخل فوق مناطق الإلغاء المؤجل إلى إلغاء يكون سلوكه كما لو حدث إلغاء غير متزامن وقد يتسبب في عدم تناسق حالة التطبيق.
errno¶
جلب وتعيين قيمة errno آمن للإشارات غير المتزامنة بشرط أن يحفظ معالج الإشارة errno عند الدخول ويعيد قيمته قبل العودة.
الانحرافات في مكتبة GNU C¶
تحدث الانحرافات المعروفة التالية عن المعيار في مكتبة GNU C:
- •
- قبل glibc 2.24، استخدمت execl(3) و execle(3) realloc(3) داخليًا وبالتالي لم تكن آمنة للإشارات غير المتزامنة. أُصلح هذا في glibc 2.24.
- •
- تطبيق glibc لـ aio_suspend(3) ليس آمنًا للإشارات غير المتزامنة لأنه يستخدم pthread_mutex_lock(3) داخليًا.
انظر أيضًا¶
ترجمة¶
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 8 فبراير 2026 | صفحات دليل لينكس (لم تصدر بعد) |