前提・実現したいこと
c言語を用いて、簡単なシグナル応答する以下のプログラムを作っています。
SIGUSR1:グローバル変数x、yを表示する。
SIGUSR2:プログラムを終了する。
発生している問題・エラーメッセージ
いろんなページを参考にしたのですが、なかなかうまく表示されません。
該当のソースコード
c
1#include <stdio.h> 2#include <signal.h> 3 4void sig_usr1(int signo); 5void sig_usr2(int signo); 6double x,y; 7 8void sig_handler(int signo){ 9 if(signo==SIGUSR1){ 10 display_xy(); 11 signal(SIGUSR1,sig_handler); 12 } 13 14 if(signo==SIGUSR2){ 15 exit(0); 16 signal(SIGUSR2,sig_handler) 17 } 18} 19 20void display_xy(int signo){ 21 printf("x:%f,y:%f",x,y); 22} 23int main(void){ 24 signal(SIGUSR1,sig_handler); 25 signal(SIGUSR2,sig_handler); 26} 27
補足情報(FW/ツールのバージョンなど)
masOS,c,UNIX
ご教授いただければ幸いです。
よろしくお願いいたします。
中身が無いです。
提示のコードではどう出力されるんでしょうか
どううまくいかないのですか。と言いますか、追記されたコードを見ると、main()でシグナルハンドラを登録してシグナルを待つまでもなく、即、終了してしまっていますが。
たくさんのリプライありがとうございます。
y_waiwai
実行したところ何も出ませんでした。
dodox86
あまり把握しきれていないのですが、main()内にて、シグナルが受信できていないということでしょうか。
> あまり把握しきれていないのですが、main()内にて、シグナルが受信できていないということでしょうか
自分でお書きになったコードなのですから、把握しましょう。main()を実行すると、どうなるのか。少なくともmain()はすぐ終わってしまいますよね。シグナルを扱うサンプルコードは色々と見たのでしょうから、自分用に改造する前にシグナルとはどういうものか、どう扱うのか少しでも理解しましょう。それともそれら全てひっくるめて教えて欲しい、と言うご質問でしょうか。
おしゃる通りです。
私の勝手な見解では、sig_handler関数内でシグナル受信後の処理を定義できるものだと考えておりました。
質問の内容があいまいで申し訳ございません。
SIGUSR1でグローバル変数の表示の処理、SIGUSR2でプログラムの終了の処理を定義したいのですが、それがうまくいかず、ヒントだけでもと思った次第です。
> sig_handler関数内でシグナル受信後の処理を定義できるものだと考えておりました。
それは合っていますが、有効なのはmain()、つまりそのプログラム自身が動いている間だけです。プログラムが終了したらそのシグナルハンドラも消えます。その点は理解されていますか。
シグナルを受け取るも何も、プログラムが終了したら、どうしようも無いです。
mainに、sleep(100); をいれるとか。
>プログラムが終了したらそのシグナルハンドラも消えます。
ご指摘ありがとうございます。なるほど。勉強になります。for(;;)やwhile(1)などで無限ループするなどして、稼働し続ける必要があるのですね。
>シグナルを受け取るも何も、プログラムが終了したら、どうしようも無いですmainに、sleep(100); をいれるとか。
ご指摘ありがとうございます。なるほど。とても納得がいきました、ありがとうございます。sleep(100)という手もあるのですね。
ああ、シグナルを受けるとsleepから復帰するので、while(1) sleep(100); みたいにしないと終わっちゃいます。
あと、printfで改行するか、fflushしないと表示内容がバッファリングされます。
>シグナルを受けるとsleepから復帰するので、while(1) sleep(100); みたいにしないと終わっちゃいます。
なるほど、ありがとうございます。
>あと、printfで改行するか、fflushしないと表示内容がバッファリングされます。
バッファリングとは、行全体が入力されるまでプログラムに入力データが渡らないという意味でしょうか。
> バッファリングとは、行全体が入力されるまでプログラムに入力データが渡らないという意味でしょうか。
出力ですよ。
プログラムが出力してもバッファに溜まるだけで端末に表示されないと言うことです。
>出力ですよ。プログラムが出力してもバッファに溜まるだけで端末に表示されないと言うことです。
なるほど。ご丁寧にありがとうございます。
つまり、
printf("x:%f,y:%f \n",x,y);
ということでしょうか。
fflush関数便利ですね。勉強になります。
printf(fo,"x:%f,y:%f ",x,y);
fflush(fo);
といった具合でしょうか。
何度もすみません。
はい。バッファから端末・ファイル・パイプに出るのは、
・バッファがいっぱいになった時
・fflushかfcloseを呼んだとき
・端末の場合だけは改行でもバッファから端末に出る(ラインバッファリング)のがデフォルト
です。
あとは、そもそもバッファリングしないようにするか。setbuf(stdout,NULL);
stderrは最初からバッファリングしない設定になっています。
ご丁寧にありがとうございます。
試してみます。
回答1件
あなたの回答
tips
プレビュー