2010-11-30 10 views
4

kill(pid、SIGTERM)を使用した後、私のプログラムをsleep()することができませんでした 私は何ができますか?sleep after kill

私が使用しているコード:

kill(PID_of_Process_to_be_killed,SIGTERM); 
sleep(5); --> this is not working 
sleep(5); --> this is working 

を今のところ解決策は次のとおりです。

kill(PID_of_Process_to_be_killed,SIGTERM); 
sleep(sleep(5)); 

が、なぜ最初の睡眠キルリターン0の後に?

答えて

6

sleep()信号が受信されたために、コールが早期に終了することがあります。戻り値を確認してください。それが肯定的であれば、その値で再びsleep()にすることができます。 http://www.manpagez.com/man/3/Sleep/から:要求された時間が経過しているため、スリープ()関数が返した場合

、 返される値はゼロになります。 スリープ()関数は、送信した後に何らかの理由秒

+1

この場合、シグナルは偶然SIGCHLDです(ただし、これは問題のコードで最初のスリープを中断しますが、私は思っています)。しかし、何でもかまいません。 –

3

あなたがシグナルを処理しない限り、SIGTERMは死です。

信号sleepを送信している別のプロセスまたはスレッドがEINTRを返した場合。

ダイレクトシステムコール(おそらくそうです)の代わりに標準ライブラリを使用している場合、スリープは-1とerrno = EINTRを返します。

+0

に返された値がunslept量 (要求された時間を引いた時間が実際に眠っていた)になり、原因 への信号の受け渡しを返した場合元のハンドラを使ってSIGTERMを使ってkillすると、私はsleep関数を使うことができません。私はその前にそれを使用することができますが、殺した後ではありません... これはなぜ起こるのですか? kill(PID_of_Process_to_be_killed、SIGTERM); sleep(5); - これは動作していません。 sleep(5); - >これは動作しています –

+0

ERRNOには何が含まれていますか?睡眠は何を返すのですか? – Joshua

+0

最初のスリープ復帰5 - 何もしなかったことを意味します。 と2番目のsleep(5)は0を返します。つまり、5秒間スリープします。 "errno = EINTER" 私はこのスリープ(スリープ(5))を使用していますが、私はその正しい解決策を考えていません... –