2012-06-12 11 views
6

私は書いているプログラムで非同期タスクを処理する方法がわかりませんし、経験豊かな人が少なくとも正しい方向に向けることを望んでいます。Linuxでの並列処理

私はAngstrom Linuxを組み込みARMプロセッサで実行しています。私のプログラムは露出したハードウェアPWMとPTP上のカメラを通していくつかのサーボを制御します。さらに、それは任意のクライアント(この例ではAndroid)からコマンドを受け取るソケットデーモンです。カメラのPTPは遅いですし、プログラムの残りの部分が反応する必要があるので、私はその作業を終了するのを待っていません。

私はスレッドを試しましたが、カメラのスレッドの問題はプロセス全体を殺すようです。理想的には、私は自分のことを行うためにカメラを送りたいと思いますし、終了したら主な機能を知らせてください。これは適切なフォークテクニックですか、または不適切なスレッドを実装しましたか?

さらに、私は大規模なセカンダリライブラリから遠ざかって、クロスコンパイルの問題を回避したいと思います。事前に感謝の意を表します。

+2

なぜ新しいプロセスでそれを実行しないのですか?ソケットを介して通信しますか? – Hassan

+0

私は、高度なLinuxプログラミングを私のガイドとして使用していました...それはclone()関数をカバーしません。適切な技術と思われる –

+0

可能性があります。または、それは['system()'](http://www.cplusplus.com/reference/clibrary/cstdlib/system/)かもしれません。それも見てみましょう。 – Hassan

答えて

1

stevehaの答えは基本的な方法ですが、init(8)と名前付きパイプはスキップしてください。

fork()カメラコードを含む子で、通常のパイプまたはドメインソケットを介して通信します。親のSIGCHLDのシグナルハンドラをコード化します。子が死ぬと理由コードにwait()の戻りコードがあるかどうか調べます。それ自身で死んでクリーンアップして再起動した場合、正常に終了した場合は、その場合に適切な処理を行います。どのIPCを選択しても、子供と話し合います。これにより、子供のコントロールをより細かくすることができます。具体的には、ドメインソケットやパイプは、FIFOのファンキーなセマンティクスよりも、親と子のセットアップと通信が容易になります。

もちろん、実際にカメラコードに問題がある場合は、プログラム全体を停止しないようにすれば、障害をいくらか管理しやすくなります。理想的には、カメラコードがあなたの能力の範囲内であれば、完璧に動作するようにカメラコードを取得する必要があります。

+0

カメラのコードは動作します...私の言葉の選択は貧弱でした。たとえば、カメラが接続されていない場合は、カメラスレッドが戻り、何らかの理由でプログラムにセグメンテーション違反が発生します。 clone()関数に関するあなたの意見は何ですか? –

+0

クローンはあなたのために何もしません。スレッドとフォークの両方は、クローンの周りのラッパーです。あなたがそれらに問題がある場合は、レベルを下げることはあなたの問題を解決するつもりはありません。おそらく、あなたのスレッドコードの基礎を別の質問に投稿するべきでしょう。あなたは非常に単純なエラーを作り出しているかもしれません。 – Duck

+0

おかげさまで皆様のご協力をいただきました。単純なパイプでフォークを使い、物事は私が望むように働いています。子プロセスの状態を発見するシグナルハンドラのアイデアが気に入っています。 –

3

問題は、いくつかの並べ替えのプロセス間通信(IPC)と通信する、複数のプロセスの古典的なケースのように聞こえます。

カメラには独自のプロセスが必要です。プロセスが終了すると、メインプロセスに問題はないはずです。 init(8)プロセスでカメラプロセスを管理することもできます。それは何らかの理由で死ぬと自動的にプロセスを再開することができます。

名前付きパイプを永続的に設定すると、失敗後に再起動したときにいつでもカメラプロセスが再オープンできます。ここで

は、名前付きパイプについていくつかのドキュメントです:

http://www.tldp.org/LDP/lpg/node15.html

私はWikipediaのページからこれを見つけた:

http://en.wikipedia.org/wiki/Named_pipe

私はStackOverflowのを検索し、名前付きパイプ対の議論を発見しましたソケット:

IPC performance: Named Pipe vs Socket

+0

UNIXとWindowsのドキュメントでは、UNIXパイプに関する誤った誤解があります。 'popen'はシステムコールではなく、パイプは2ウェイ(Linuxパイプではありません)であることが保証されておらず、' mknod'はパイプだけでなく、特別なファイル用です。 – Dave

+0

うわー、これはすばらしいGoogle検索の危険性を示し、文書をすばやくスキミングします。私は悪いリンクを投稿するために皆にお詫び申し上げます。私は今私の答えからそれを編集します。 – steveha

+0

あなたの助けをありがとう –

0

私はスレッドを試しましたが、カメラのスレッドの問題はプロセス全体を殺しているようです。

実際に何が起こるのでしょうか?

私は、上記の問題をデバッグする方が、フォークされたプロセスでバグを解消しようとするよりも優れていることを伝えました。むしろ、信頼性の低いカメラを備えた信頼性の高いコアシステムよりも、信頼性の高いカメラを含む信頼性の高いシステムを使用することになります。

+0

aリターン0;セグメンテーションフォールトを導入しました –

+0

@CountZero:そして、gdbはその時点でスタックに何を言っていますか?どのようなコード行がsegフォルトを引き起こしますか? –