تجاهل SIGCHLD في بعض الحالات ولكن ليس في الآخرين

StackOverflow https://stackoverflow.com/questions/631641

  •  08-07-2019
  •  | 
  •  

سؤال

في برنامجي أنا شوكة() عدة مرات اعتمادا على مدخلات المستخدم.

في بعض الحالات, أريد أن التعامل مع SIGCHLD وتقول شيئا مثل "عملية # انتهى".في حالات أخرى على الرغم من أنني أريد أن تجاهل هذه الإشارة.

كيف يمكن أن أفعل هذا ؟

هل كانت مفيدة؟

المحلول

إشارة التعامل مع إعداد عالميا لهذه العملية.إذا كنت تريد للقبض على غير متزامن إشارة مثل SIGCHLD عند بعض الأطفال إنهاء و البعض الآخر لا, لا يمكنك أن تقرر تجاهل بعض في وقت مبكر.

سوف تحتاج إلى التعامل مع إشارة في كل مرة في الوالدين ، ثم تقرر ما إذا كنت تريد تجاهله في معالج الخاص بك.

في الحد الأدنى ، معالج يجب أن لا ننتظر() على الطفل (si_pid في siginfo_t هيكل) إلى الحصاد رمز الإرجاع.عند هذه النقطة يمكنك التحقق من معرف العملية وتقرر ماذا تفعل.كنت لا تضطر إلى طباعة أي شيء إذا كنت لا تريد.

نصائح أخرى

وتريد للقبض على SIGCHLD إشارة ثم استدعاء دالة. تحتاج إلى استخدام signal() للقيام بذلك (man signal). في المثال التالي يسمى child_died() بعد القبض على SIGCHLD إشارة (عملية طفل ميت عند هذه النقطة). إذا كان هناك المعلومات التي تحتاج إلى تمرير من الطفل إلى الأم التي child_died() احتياجات شرطية، ستحتاج إلى استخدام الأنابيب (man pipe). هنا مثال من إشارة والأنابيب:

#include <signal.h>
#include <strings.h>
#include <stdio.h>

#define MAX_SIZE 256

void child_died(int);

int fd[2];

int main()
{
    int pid;
    extern int fd[];
    char *str;

    pipe(fd);
    signal(SIGCHLD, child_died);

    if ((pid = fork()) < 0) {
        // error
        printf("Error\n");
    } else if (pid == 0) {
        // child
        printf("In child process\n");
        close(fd[0]);
        str = strdup("Message from child process.\n");
        write(fd[1], str, strlen(str) + 1);
    } else {
        // parent
        wait();
        printf("Now in parent\n");
    }

    return 0;
}

void child_died(int s)
{
    char *str;
    close(fd[1]);
    read(fd[0], str, MAX_SIZE);
    printf("%s", str);
}

والمحفوظة كما sigchld.c وتجميعها مع: gcc -Wall sigchld.c -o sigchld

إذا كنت تريد تمرير عدد صحيح (مثل معرف المنتج الأطفال) أو بعض الدول الأخرى نوع البيانات من عملية تابعة لعملية الأصل عليك إما سوف تضطر إلى تحويله إلى سلسلة والعودة مرة أخرى أو إيجاد طريقة أخرى للقيام ذلك.

إذا كنت ترغب في تجاهل SIGCHLD ثم في بلدي على سبيل المثال كنت من شأنه أن يضع هذا المنطق إلى child_died(). مجرد استخدام if بسيطة. أنا لا أعرف كيف كنت البت فيه الى تجاهل الإشارة وعندما لطباعة ما تريد، وهذا هو السبب في أنني شملت الاشياء الأنابيب في قانون بلدي أعلاه. أنا أحسب أنك سوف تستخدم بعض المعلومات عن عملية طفل ومنذ يسمى child_died() على عملية الأصل، سوف تحتاج إلى وسيلة لنقل البيانات من الطفل إلى عملية الأصل.

وآمل أن يساعد هذا. قد تكون هناك طرق أفضل أو أسهل من تحقيق هذا أنني لا أعرف. إذا كان هناك ثم الرجاء التعليق.

يمكنك استخدام waitpid وظيفة في أي حجب أو غير مؤمن وضع تنتظر إشارة من إعطاء الطفل ومن ثم القيام ببعض المعالجة.في الواقع ، لديك استخدام wait من نوع ما ، كما جاء في غراهام الإجابة...

إذا كنت تجاهل SIGCHLD ثم فإن الجدول عملية ملء مع الكسالى.

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