1

fork() でプロセスツリーを作成しています(3子くらい)。kill(-getpgrp(), signal_number) でそれらすべてに簡単にシグナルを送信できますが、sigqueue で同じことを行うにはどうすればよいですか?

sigqueue() 関数はプロセスまたはプロセスのグループにシグナルを送信しますが、kill() とは異なり、pid に負の値を指定してプロセス グループ全体にシグナルを送信するために sigqueue() を使用することはできません。 .

では、それを行う方法は?

編集:

コード:

s1.c は、信号を「キャッチ」して制御するプログラムです。したがって、(同じグループ ID を持つ) s1 のカップルは、sigqueue() からのシグナルを待ちます。

int main (int argc,char *argv[])
{   

    int i=0;
    char *do=argv[1];
    int b=atoi(argv[2]); 
    int y=fork();
    if(argc !=3)
    {
        printf("wrong arg number\n");
        exit(0);
    }

do{

switch(fork())
    {
    case -1:
            perror("error \n");
            exit(1);
            break;
    case 0:
            execl("s1","s1.c",argv[1],argv[2], NULL);
            break;
    default:
            sleep(2);
            break;
}
i++;
}
while(i<3);
    sleep(2);
    printf("ssignal %d send to gpid : %d\n",b,getpgrp());

    union sigval value;
    value.sival_int = 0;
    value.sival_ptr = 0;

    if(sigqueue(getpgrp(), b, value) == 0) {
            printf("signal sent successfully!!\n");
    } else {
            perror("SIGSENT-ERROR:");
    }
    return 0;


while(wait(0) != -1){}

return 0;
}       
4

1 に答える 1

0

あなたの実装が実際に でプロセスグループのシグナル伝達をサポートしている場合、sigqueueおそらくkillのpid引数に対して行うこととまったく同じことを行う必要があります:

sigqueue(-getprgp(), signo, value);  // Nonstandard. Remember to _negate_ the PGID
sigqueue(0, signo, value);           // Nonstandard. Shorthand to signal my own PGID

ただし、厳密な基準では、あなたは不運です。 sigqueue null シグナル (0)も、プロセスのグループにシグナルを送信する機能もサポートしていません。

標準的な開発者は、null シグナルに関してsigqueue()がkill()と同じセマンティクスを持つこと、および同じパーミッション チェックが使用されることを要求しました。しかし、 kill()の「ブロードキャスト」セマンティック(たとえば、グループを処理するため) を実装することの難しさと、リソース割り当てとの相互作用のため、このセマンティックは採用されませんでした。sigqueue()関数は、pid 引数で指定された単一のプロセスへのシグナルをキューに入れます。

于 2016-09-12T20:32:57.753 に答える