2016-09-12 4 views
1

fork()(約3子)でプロセスツリーを作成します。私はeasly kill(-getpgrp()、signal_number)を使ってそれらのすべてにシグナルを送ることができますが、sigqueueで同じことをする方法は?プロセスグループにシグナルを送るsigqueue()

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

どのようにするのですか?

EDIT:

コード:

s1.cは私 "キャッチ" の信号は、それらの制御を取るためのプログラムです。 したがって、(同じグループidを持つ)s1のカップルはsigqueue()からの信号を待ちます。あなたの実装が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; 
}  
+1

"' sigqueue() '関数は、プロセス**またはプロセスのグループ**にシグナルを送ります**"どこで 'sigqueue()'を使ってシグナルを送ることができますか?プロセスグループ全体? [POSIX仕様書](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigqueue.html)と[Linux man page](http://man7.org/linux/man-pages/man3/sigqueue .3.html)は、単一のプロセスだけがシグナルを送ることができると述べています。 –

+0

[link](https://www.mkssoftware.com/docs/man3/sigqueue.3.asp)、こちらそれではどうしたらいいですか?可能です?多くの記事は、kill()とsigqueue()がかなり同じであることを教えてくれます... – Baal

答えて

0

、あなたはおそらく正確what you would do for the pid argument to kill実行する必要があります。厳格な規格で

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

、しかし、あなたは運が悪いです。 sigqueuesupports neither the null signal (0) nor the ability to signal groups of processes

標準開発者は、とき、sigqueue()キル()としてヌル信号に対して同一の意味を有することが必要と同じ許可チェックが使用すること。しかし、kill()(例えば、グループを処理する)の "ブロードキャスト"意味と、リソース割り当てとの相互作用を実装することの難しさのために、この意味論は採用されませんでした。 sigque()関数は、pid引数で指定された単一のプロセスにシグナルをキューに入れます。

+0

私の 'sigqueue'の実装は?ですから...これを行う方法は他にありませんか?どういうわけか、私が作成したすべての子供からpidを引き出しますか? – Baal

+0

@Baal、 "implementation"とは、実行しているプラ​​ットフォーム/環境を意味します。あなたが望むことをするための他の方法については...私はあなたがこのサイトで別の質問をすることをお勧めします。 – pilcrow

関連する問題