マルチスレッドのLinux/C++プログラムでは、fork()
にSIGCHLD
のシグナルハンドラを使用したいと考えています。マルチスレッドプログラムとfork():代替または安全な実装
子プロセスでは、open()
を使用して、2つの新しいファイル記述子、sendfile()
およびclose()
を作成すると、子は終了します。
私は、次の要件を実装するためにfork()
を使用する計画:親プロセス内のスレッドが
- 子プロセスの正常終了を検出し、その場合にしなければならないことができるようにするもの
を別のファイルを作成する
fork()
ファイルの範囲に対してを実行することが可能 - 特定のイベントの場合は
sendfile()
-childプロセスを強制終了し、クリーンアップする意図的終了を検出する
要件1の場合は、sendfile()
の結果を待つことができます。 要件2は、私が最初にfork()
を使用する必要がある理由です。
次の記事に
を読んだ後、私は私のソリューションは良いものではないかもしれないと思います。
私の質問は以下のとおりです。
- は要件2を実装するための他の解決策はありますか?
- または、ライブラリで
open(), close() and sendfile()
が正常に呼び出されるようにするにはどうすればよいですか?
更新:
- プログラムは、私は、私はいくつかの記事のために最も効率的なファイル転送を持つために
sendfile()
を使用する必要があることを想定してきた - BusyboxのLinuxでは/ ARM上で実行されますこの話題について読んだことがあります。 Update 2のファイル転送が少ない効率的な
かもしれないというのが私の要件は不利で、cp
でfork()
とexec*()
を使用することができ実装する 安全な方法:
- 一度
fork()
に十分です子プロセスでrsync
でexec*()
に切り替えたので、特定のイベント(ファイルごとに1回ではなく)が発生したためです。しかし、プログラムは特定のイベントの場合に常にrsync
を呼び出す必要があります。
または、フォークの代わりにバックグラウンドスレッドで読み書きするだけです。 –
マルチスレッドプログラムからのforkは、一般的に未定義の動作です。より具体的には、フォークされた子は、(基本的に)許可された操作のみが終了またはexecである非同期信号コンテキストにある。あなたが非常に決定的に*できないものは、メモリ割り当てのようなものです。 –
@RichardCritten: 'sendfile()'が返るのを待っている間にbgスレッドに停止するよう指示する方法はわかりません。巨大なファイルが処理されるのを待つ必要はありません。 – radix