0

簡単なコード:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>

using namespaces td;                                                             
bool unblock = false;                                                  
long int ile = 0;                                                 

void ouch(int sig) {
    cout << "signal " <<  sig << endl;                               
    unblock = true;                                                  
}                                                                
int main(){                                                          
    struct sigaction act;                                           
    act.sa_handler = ouch;                                           
    sigemptyset(&act.sa_mask);                                  
    act.sa_flags = 0;                                             
    sigaction(SIGINT, &act, 0);                                    

    do {                                                         
        cout << "." << endl;                                         
    } while(!unblock);                                                          

    cout << "EXIT" << endl;                                          
}

コードをコンパイルすると、「a.out」が得られます。a.out を次のように実行すると:

[przemek@localhost test]$ ./a,out

期待どおりに実行され、CTRL + Cを押すと、必要に応じてプログラムが終了しますが、このようにプログラムを実行すると(プロジェクトで必要です):

[przemek@localhost test]$ ./a.out&

OS は制御をシェルに渡し、CTRL+C でループを中断できません

このコードを bash スクリプトで実行する必要があり、バックグラウンドで実行する必要があります。そのような状況でどうにかして信号をキャッチすることは可能ですか?

4

1 に答える 1

3

を押すctrl-cと、シグナル 2 (SIGINT) が現在のプロセス (端末のフォアグラウンドで実行されるプロセス) に送信されます。以下を使用して、バックグラウンドで実行される (& で開始された) プロセスにシグナルを送信できますkill

$ kill -2 %%

あなたが言うときは、最後のバックグラウンド プロセス%%を意味します。もちろん、別のものを指定することもできます。その PID (ps(1) を参照) または JobID (bash(1)/jobs) を知る必要があります。

% 表記は、ジョブ管理のあるシェル内 (例: 内bash) でのみ使用できることにも注意してください。そのようなシェルを使用していない場合は、PID のみを使用できます。

最後に開始されたプロセスの PID は にあり$!ます。これは、一部のスクリプトで役立つ場合があります。

于 2012-06-18T14:21:38.693 に答える