0

私は試験のためにいくつかの練習問題を行っています。問題の 1 つは、parent.c と child.c という 2 つのコードを提供します。親は子を作成し、それにシグナルを発し、子はシグナルを受信するたびにメッセージを表示します。子は残りの時間をメインからのメッセージの出力に費やします。問題は、child.c のシグナル処理の何が問題なのかを説明し、それを修正するためにコードを書き直すことです。シグナルの一般的な考え方は理解できますが、シグナルを実装するのは非常に困難です。in child.c が適切に機能しているかどうかprocmaskはわかりません。シグナルに完全に慣れているわけではありませんが、最後のパラメーターとして配置する理由がわかりません。NULLおそらくそれが理由の一部です。間違っていますか?誰かが私を正しい方向に向けて、コードのどの部分が間違っているのか、その理由を教えてください。

親.c

#include <unistd.h>
#include <signal.h>
int
main(int argc, char *argv[])
{
    pid_t pid;
    sigset_t set;

    sigemptyset(&set);

    sigaddset(&set, SIGUSR1);

    sigprocmask(SIG_BLOCK, &set, NULL);

    pid = fork();

    if (pid == 0) {
        execlp("./child", "./child", NULL);
    }

    while (1) {
        kill(pid, SIGUSR1);
    }

    return (0);
}

Child.c

#define _XOPEN_SOURCE 500

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

static void
handler(int signo)
{
    printf("This is the SIGUSR1 signal handler!\n");
}

int
main(void)
{
    sigset_t set;

    sigemptyset(&set);

    sigset(SIGUSR1, handler);

    sigprocmask(SIG_SETMASK, &set, NULL);

    while (1) {
        printf("This is main()!\n");
    }

    return (0);
}
4

2 に答える 2

0
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

最後のパラメーターは、古いシグナル マスクを格納するために使用されます。の場合NULLは、古いシグナル マスクを保存する必要がないことを意味します。

printf再入可能ではないため、シグナルハンドラーで使用しないでください。シグナルハンドラーでのprintfの使用を回避する方法を参照してください。

として定義される可能性があり、コンパイラはそれがヌルポインターではなく整数であると考える可能性があるため、の使用法execlpは間違っています。NULL0

execlp("./child", "./child", NULL);

最後のパラメータは(char *)0、次のようにする必要があります。

execlp("./child", (char *)0);
于 2013-08-05T11:59:38.170 に答える