2016-08-11 10 views
0

マルチスレッドのLinux/C++プログラムでは、fork()SIGCHLDのシグナルハンドラを使用したいと考えています。マルチスレッドプログラムとfork():代替または安全な実装

子プロセスでは、open()を使用して、2つの新しいファイル記述子、sendfile()およびclose()を作成すると、子は終了します。

私は、次の要件を実装するためにfork()を使用する計画:親プロセス内のスレッドが

  1. 子プロセスの正常終了を検出し、その場合にしなければならないことができるようにするもの

    を別のファイルを作成するfork()ファイルの範囲に対してを実行することが可能

  2. 特定のイベントの場合はsendfile() -childプロセスを強制終了し、クリーンアップする意図的終了を検出する

要件1の場合は、sendfile()の結果を待つことができます。 要件2は、私が最初にfork()を使用する必要がある理由です。

次の記事に

を読んだ後、私は私のソリューションは良いものではないかもしれないと思います。

私の質問は以下のとおりです。

  • は要件2を実装するための他の解決策はありますか?
  • または、ライブラリでopen(), close() and sendfile()が正常に呼び出されるようにするにはどうすればよいですか?

更新:

  • プログラムは、私は、私はいくつかの記事のために最も効率的なファイル転送を持つためにsendfile()を使用する必要があることを想定してきた
  • BusyboxのLinuxでは/ ARM上で実行されますこの話題について読んだことがあります。 Update 2のファイル転送が少ない効率的な

かもしれないというのが私の要件は不利で、cpfork()exec*()を使用することができ実装する 安全な方法:

  • 一度fork()に十分です子プロセスでrsyncexec*()に切り替えたので、特定のイベント(ファイルごとに1回ではなく)が発生したためです。しかし、プログラムは特定のイベントの場合に常にrsyncを呼び出す必要があります。
+0

または、フォークの代わりにバックグラウンドスレッドで読み書きするだけです。 –

+0

マルチスレッドプログラムからのforkは、一般的に未定義の動作です。より具体的には、フォークされた子は、(基本的に)許可された操作のみが終了またはexecである非同期信号コンテキストにある。あなたが非常に決定的に*できないものは、メモリ割り当てのようなものです。 –

+0

@RichardCritten: 'sendfile()'が返るのを待っている間にbgスレッドに停止するよう指示する方法はわかりません。巨大なファイルが処理されるのを待つ必要はありません。 – radix

答えて

3

スレッドを使用できますが、強制的にスレッドを終了すると、通常、メモリリークなどの問題が発生します。

私のLinuxの経験はいくらか限定されていますが、おそらくは、マルチスレッド化される前にプログラムを早めに実行します。これで、2つのインスタンスが作成されたため、シングルスレッドのインスタンスを安全に使用して、追加のインスタンスの開始と停止を管理できます。

+0

これはおそらく開発の開始時に検討した場合の解決策になる可能性がありますが、残念ながら私の場合はSWの設計に非常に影響します。 – radix

+0

私は、なぜそれが事実であるかをもっと説明しなければならないと思います。プロセス間通信には共有メモリなどを使用できることにご注意ください。フォークされたインスタンスには、タスクを実行するために必要なデータが必要です。データだけでなく他のリソースも必要ですか? –

+0

"転送スレッド"がエラーを報告するためにクラスインスタンスへのポインタを受け取ることが1つの問題です。ログ関数は、メインスレッドで実行されるインスタンスを持つ他のクラスでも使用されます。これは基本的に、スレッドの残りの設定と同様に、IPCによって解決できます。私はもっ​​と簡単な解決策を見つけたいと思っていました。 – radix

関連する問題