アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちわ,

今シェルスクリプトの学習をしています。
シェルスクリプトのなかであるプログラムにSIGINTを送るシェルスクリプトを作るにはどうすればいいでしょうか。
たとえば,
./hogeというCプログラムがあり,その中でsignal関数を用いてSIGINTを捕らえるようなプログラムがなされているとき,
シェルスクリプトで

#!/bin/sh
./hoge &
PID=$$
sleep 2
kill SIGINT $PID

だと,$$にはこのシェル自体のPIDが返ってきているので,うまくいきません。

なんとか,./hogeをうごかし,その後何秒かあとにSIGNALを送るようなシェルスクリプトを作りたいのですが,どうすればいいでしょうか。

Cでforkさせて外部呼出しによって送るしかないのでしょうか。

よろしくお願いします。

A 回答 (4件)

No2のtatsu99さんが書かれている通り、「$!」でバックグラウンド実行したプロセスのプロセスIDが取得できます。


ただし、これはBシェル(/bin/sh)の標準的な仕様であり、Linuxに限らずBシェルの動く環境であれば、ほぼ例外なく使える機能です。
もちろん、bashのようなBシェルの上位互換シェルでもつかえます。

ちなみに、このような特殊変数には他に、
$? 直前のコマンドの終了ステータス
$$ 実行中のシェルスクリプトのPID
$- Bシェルを制御するフラグの状態
などがあり、シェルスクリプトを使う際には非常に役に立ちます。
    • good
    • 0

No2です。


Linuxの場合は、$!が直前にバックグラウンドで実行したプロセスIDになります。
PID=$! として確認してみてください。
    • good
    • 0

基本的には以下の方法をとります。


1.PSコマンドを実行する。
2.その結果からhogeのプログラムの行をピックアップする。
3.その行のプロセスIDを取得する。
PSによって表示される内容がOSによって若干異なりますので、どのOSで動作させるのかも提示されると、さらによい回答が得られると思います。
    • good
    • 0

私はシェルスクリプトに関してはよく知らないので、


参考になりそうなURLだけ紹介しておきます。
# 「じゃあ、コメントするな」というご指摘、覚悟してます

ぱっとみたかんじだと、yu393939さんが望んでいる処理をできそうな感じがします。

お目汚し、失礼。

参考URL:http://www.nishimoto-site.net/archiver/fj/unix/2 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!