追加読書

追加読書

C ++プログラムにシグナルハンドラがあります。

void term(int signum)
{
    cout << "in term" << endl;
    # Do Stuff
    exit(0);
}

int main(int argc, char *argv[])
{
    # Do Stuff
    signal(SIGINT, term);
    # Do Stuff
}

プログラムはうまく動作します。押してCtrl+Cいくと機能項目に入ります。

ただし、スクリプトを使用してその動作を複製しようとすると機能しません。

私が実行しているスクリプトの単純化されたバージョンは次のとおりです。

! /bin/bash
sudo ./program &
rpid=$!

sleep 2
sudo kill -INT $rpid
# sudo kill -TERM $rpid
# sudo kill $rpid

echo "killed"
wait $rpid

プログラムは、を押すまで用語機能を入力しませんCtrl+C。無限大気状態で止まっています。

答え1

% sudo sh -c 'exec echo 私のプロセスIDは$$です。 '&echo "XyrプロセスIDは$\!です。"
[1]59130
XyrプロセスIDは59130です。
私のプロセスIDは59131です。
[1] +完了 sudo sh -c 'exec echo 私のプロセスIDは$$です。 '
%

プラグ型認証モジュールの世界へようこそ!loginsuなどのプログラムは、sudo対象プログラムと重複しなくなります。

間違ったプロセスに信号を送信しています。

追加読書

関連情報