2011-12-19 31 views
2

私のプログラムでfork()の子プロセスがいくつか処理されてから無限ループに入ります(子プロセスは無限です) 。今、私は、すべてのプロセスを殺すソケットを閉じ、はCtrl +CまたははCtrl +Zしてプログラムを終了するには、共有メモリ、およびクリーンなすべての類似したものをデ添付する。私はインターネットを検索して、SIGSTOPやSIGINTのようなシグナルを送ることでそれを行うことができることを発見しましたが、私はそれをどうやって行うのか分かりません。私のプログラムでこれをどのように達成できますか?ctrl + Cまたはctrl + Zで親プロセスとその子プロセスを強制終了する方法

+0

^Zは一般的にプログラムを終了しませんが、後で続けることができるように一時停止します。 –

+0

あなたはおおよそ答えを得ていると思います。シグナルを他のプロセスに送るためのシステムコールについては、kill(2)のマニュアルページを参照してください:http://linux.die.net/man/2/kill また、シグナルハンドラ、 sigactionのmanページを参照してください。あるいは、シグナルが受信されたときにコードをディスパッチするために、ステートマシンであるlibevを使うことを強くお勧めします。それは間違いからあなたを守ります。 – Sam

答えて

0

プロセスが残酷に終了すると、すべてのリソースが確実に解放されます。

しかし、振る舞いを制御したい場合(どのような順序など、私にはわからない)、シグナルハンドラをインストールする必要があります。 sigaction(2)を参照してください。

+0

共有メモリはその例外の1つです。セグメントは破壊のためにマークされ、その後、そのセグメントの出口のすべてのクライアントがメモリが解放されるときにマークされなければならない。 http://linux.die.net/man/2/shmctl – Sam

1

プログラムの外側からは、killコマンドを使用して任意のプロセスに信号を送信できます。

デフォルトでは、killはSIGTERMシグナルを送信し、プロセスを終了し、割り当てられたリソースを解放します。 psコマンドを使用して、プログラムのプロセスのプロセスIDを見つけることができます。 CTRL - Cを使用すると、親プロセスのみが終了します。子プロセスを強制終了しません。 forkして新しいプログラムをexecしなかった場合、すべての子プロセスは親と同じ名前になります。つまり、killallコマンドを使用してすべてを一度に終了することができます。リモートでログインしている場合、ログアウトすると、セッション中に生成したすべてのプロセスにSIGHUPシグナルが送信され、デフォルトで終了します。

プログラム内からは、コマンドと同様に動作するkill()関数があります。プロセスIDは依然として必要なので、親コードがforkによって返された子プロセスIDを覚えておくことが重要です。

関連する問題