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) داخليًا.

انظر أيضًا
sigaction(2)، signal(7)، standards(7)

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

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

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