私のプログラムでfork()の子プロセスがいくつか処理されてから無限ループに入ります(子プロセスは無限です) 。今、私は、すべてのプロセスを殺すソケットを閉じ、はCtrl +CまたははCtrl +Zしてプログラムを終了するには、共有メモリ、およびクリーンなすべての類似したものをデ添付する。私はインターネットを検索して、SIGSTOPやSIGINTのようなシグナルを送ることでそれを行うことができることを発見しましたが、私はそれをどうやって行うのか分かりません。私のプログラムでこれをどのように達成できますか?ctrl + Cまたはctrl + Zで親プロセスとその子プロセスを強制終了する方法
答えて
プロセスが残酷に終了すると、すべてのリソースが確実に解放されます。
しかし、振る舞いを制御したい場合(どのような順序など、私にはわからない)、シグナルハンドラをインストールする必要があります。 sigaction(2)
を参照してください。
共有メモリはその例外の1つです。セグメントは破壊のためにマークされ、その後、そのセグメントの出口のすべてのクライアントがメモリが解放されるときにマークされなければならない。 http://linux.die.net/man/2/shmctl – Sam
プログラムの外側からは、kill
コマンドを使用して任意のプロセスに信号を送信できます。
デフォルトでは、killはSIGTERM
シグナルを送信し、プロセスを終了し、割り当てられたリソースを解放します。 ps
コマンドを使用して、プログラムのプロセスのプロセスIDを見つけることができます。 CTRL - Cを使用すると、親プロセスのみが終了します。子プロセスを強制終了しません。 forkして新しいプログラムをexecしなかった場合、すべての子プロセスは親と同じ名前になります。つまり、killall
コマンドを使用してすべてを一度に終了することができます。リモートでログインしている場合、ログアウトすると、セッション中に生成したすべてのプロセスにSIGHUP
シグナルが送信され、デフォルトで終了します。
プログラム内からは、コマンドと同様に動作するkill()
関数があります。プロセスIDは依然として必要なので、親コードがforkによって返された子プロセスIDを覚えておくことが重要です。
- 1. ctrl + Cでシェルスクリプトによって開かれたすべてのプロセスを強制終了するには?
- 2. 親スクリプトを終了せずにCtrl-Cでプログラムを終了
- 3. スクリプトでのプロセスの強制終了
- 4. DB2でプロセス/クエリを強制終了する方法
- 5. 親プロセスによって子プロセスを強制終了するにはどうすればいいですか?
- 6. Powershell ISEはプロセスを強制終了してフリーズします
- 7. ホットスポットクラッシュ時にJavaプロセスを強制終了する方法
- 8. WiXからプロセスを強制終了する方法
- 9. プロセスが強制的に強制終了された場合の終了コード
- 10. Java ProcessBuilder process.destroy()はwinXPで子プロセスを強制終了しません
- 11. 名前でプロセスを強制終了するには? (Win32 API)
- 12. C#:プロセスの終了時にプロセスが終了する(タスクマンで)
- 13. Windows上でrunhaskellプロセスを終了する
- 14. Javaアプリケーションでプロセスを強制終了する問題
- 15. シェルで親プロセスと子プロセスを削除する方法は?
- 16. 実行中のPythonプロセスを強制終了するには?
- 17. 特定のクロムタブ/プロセスを強制終了するには
- 18. mysqldプロセスを強制終了できますか?
- 19. Mercurial(hg)プロセスを強制終了できますか?
- 20. C#アプリケーションのプロセスでルビスクリプトを終了する方法、または一般的にプロセスを終了する方法は?
- 21. スーパーバイザはプロセスを強制終了しません
- 22. Linuxでプロセスが強制終了したことを確認しました
- 23. プロセスを強制終了する前にgmon.outを保存する
- 24. 親プロセスの子プロセスの数C/C++、LINUX
- 25. ループを終了しようとするとCtrl + Zが機能しません
- 26. 長時間実行中のFastcgiプロセスを強制終了する
- 27. C++でプロセスを終了するには?
- 28. 正常に終了する場合、プロセスを強制終了しないでください。
- 29. Debianでのプロセスの強制終了 - "sh:/ usr/bin/p $:not found"
- 30. プロセスを強制終了しないでください
^Zは一般的にプログラムを終了しませんが、後で続けることができるように一時停止します。 –
あなたはおおよそ答えを得ていると思います。シグナルを他のプロセスに送るためのシステムコールについては、kill(2)のマニュアルページを参照してください:http://linux.die.net/man/2/kill また、シグナルハンドラ、 sigactionのmanページを参照してください。あるいは、シグナルが受信されたときにコードをディスパッチするために、ステートマシンであるlibevを使うことを強くお勧めします。それは間違いからあなたを守ります。 – Sam