تعيين و Oldset في sigprocmask ()
-
09-06-2019 - |
سؤال
لم أفهم تمامًا كيفية الاستخدام sigprocmask()
.وخاصة كيف set
و oldset
وعمل تركيبها وكيفية استخدامها.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
يرجى الشرح بمثال، للحظر، قل SIGUSR1 لبضع ثوان ثم قم بإلغاء الحظر والتعامل معه.
المحلول
الفكرة هي أن تقوم بتوفير قناع في set
, ، قائمة الإشارات بشكل فعال.ال how
تقول الحجة ما يجب عليك فعله بالقناع set
.
يمكنك إما استخدام SIG_BLOCK
لمنع الإشارات في set
القائمة، أو SIG_UNBLOCK
لإلغاء حظرهم.ولا يغير أي منهما الإشارات التي لم يتم تعيينها في القائمة. SIG_SETMASK
يحظر الإشارات الموجودة في القائمة، ويزيل حظر الإشارات غير المدرجة في القائمة.
على سبيل المثال، لنفترض أن قائمة الحظر القديمة كانت {SIGSEGV, SIGSUSP}
وأنت تتصل sigprocmask
مع هذه الحجج:
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
قائمة الحظر الجديدة ستكون الآن {SIGSEGV, SIGSUSP, SIGUSR1}
.
إذا اتصلت sigprocmask
مع هذه الحجج الآن:
sigprocmask(SIG_UNBLOCK, &x, NULL)
قائمة الحظر الجديدة سوف تعود إلى الوجود {SIGSEGV, SIGSUSP}
.
إذا اتصلت sigprocmask
مع هذه الحجج الآن:
sigprocmask(SIG_SETMASK, &x, NULL)
سيتم الآن تعيين قائمة الحظر الجديدة على {SIGUSR1}
.
ال oldset
تخبرك الوسيطة بقائمة الحظر السابقة.فإذا كان لدينا هذا التصريح:
sigset_t y;
ونسمي الكود في الأمثلة السابقة هكذا:
sigprocmask(SIG_BLOCK, &x, &y)
الآن لدينا:
y == {SIGSEGV, SIGSUSP}
إذا فعلنا الآن:
sigprocmask(SIG_UNBLOCK, &x, &y)
سوف نحضر
y == {SIGSEGV, SIGSUSP, SIGUSR1}
وإذا فعلنا:
sigprocmask(SIG_SET, &x, &y)
سوف نحصل على هذا:
y == {SIGSEGV, SIGSUSP}
لأن هذه هي القيمة السابقة لمجموعة الحظر.