1. ホーム
  2. c

[解決済み] sigsuspendの使用方法

2022-02-10 10:14:57

質問事項

このようなコードで、信号待ちを繰り返すブロックを作らなければなりません。私の先生は、一時停止やスリープの代わりに、シグナスペンドとマスクを使うように言っています。私はsigsuspendやmaskについてよく知らないのですが、sigsuspend()が呼び出し側のプロセスのシグナルマスクをmaskで与えられたマスクに一時的に置き換え、シグナルハンドラを呼び出すかプロセスを終了させるようなシグナルが送られるまでプロセスを一時停止させることは分かっています。 しかし、どのように実装すればよいのでしょうか。

#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

unsigned Conta = 0;

void mypause(int sign)
{
    switch (sign)
    {
        case SIGINT:
            printf("You've pressed ctrl-C\n");
            printf("I'm running waiting for a signal...\n");
            Conta++;
            break;

        case SIGQUIT:
            printf("You've pressd ctrl-\\n");
            printf("Number of times you've pressed CTRL-C: %d", Conta); 
            exit(0);
            break;
    }
}

int main()
{
    alarm(3);
    printf("I'm Alive\n");

    signal(SIGINT, mypause);
    signal(SIGQUIT, mypause);
    printf("I'm running, waiting for a signal...\n");
    while (1)
    {
    }

    return (0);
}

解決方法は?

簡単な方法としては、ただ単に sigsuspend を空のマスクで指定します (つまり、どんな信号でもプログラムを起動させることができます)。

sigset_t myset;
(void) sigemptyset(&myset);
while (1) {
    (void) printf("I'm running, waiting for a signal...\n");
    (void) sigsuspend(&myset);
}

次のステップでは sigprocmask を使用して、2つのハンドリングされたシグナルを無効化します ( SIGINTSIGQUIT で待ち受けにしているとき以外に発生しないようにすること)。 sigsuspend . その場合、以下のようにして得られた「古いマスク」を使用します。 sigprocmask サスペンド時に空のマスクではなく