سؤال

لم أفهم تمامًا كيفية الاستخدام 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}

لأن هذه هي القيمة السابقة لمجموعة الحظر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top