質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

組み込みLinuxにおけるマルチタスク(マルチプロセス)プログラミングの方法について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,127

ibojiro

score 17

たとえば、大分はしおっていますが以下のようにforkのみを使ったプログラムの場合(こういうやり方がいいのかどうかはわかりませんが。。。)

1。表示処理dsp_main()、
2。シリアル受信処理rxserial_tsk()
3。メイン内のGPIO監視処理gpio_chk()
の3つの処理がマルチプロセス(並列)に動いていると考えてもよろしいでしょうか?
こういうやり方が不適切な場合は、どのようにすべきかご教示いただけると助かります。
※インデントがうまくいかないのはご容赦ください。

main()
{
/・・略・・/

//子プロセス1作成
switch(pid=fork())
{
case    0:     
dspmain();    // 表示処理 
break;
case    -1:
perror("fork");
break;
}

//子プロセス2作成
switch(pid=fork())
{
case    0:     
rxserial_tsk((void *)&fd);// シリアル受信処理
break;

case    -1:
perror("fork");
break;
}
whlie(1)
{
gpio_chk();    // 親の処理・・・GPIO 監視
}
}

以上よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

作るものの規模と、要件と、どのようなデータ連携を行うかによるケースバイケースですが、
画面と受信と何かと…という感じからして、
「画面制御プロセスはそのまま稼働している横で、受信プロセスだけ再起動」
とかいう要件が出てきそうなので、
私なら、各々のプロセスを個別に立ち上げても良いような作りにし、共有メモリで連携すると思います。
(わざわざメインプロセスからfork()&exec()せず、起動シェルを作って個別に起動する)
共有メモリを使うまでもない程度の連携なら、ファイル等でも良いです。

但し、再起動は「丸ごと」の方が都合が良くて全てを1人で組む程度の小規模ならば、マルチスレッドにします。

処理をいくつものプロセスに分割して、並列に動作させたい場合

計算処理や、ちょっとした下請けの処理や、並列処理が終わったのを待って別のことをしたい場合は
スレッドの方が良いです。
他にも、同じ処理で並列数を大量に立てる時も、スレッドの方が良いです。

一方、バックグラウンドでずっと稼働し続ける系の処理や、
何かあっても中断したくない処理(受信処理とか)は別プロセスを立ててやらせた方が
良い場合が多いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/24 07:59

    回答ありがとうございます。参考にさせていただきます。

    キャンセル

+1

xargsで使用プロセスの上限数を指定しながらやったほうがいいと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 10:30

    回答ありがとうございます。xargsというキーワードを初めて知りました。このキーワードを頼りに調べてみたいと思います。

    キャンセル

+1

こんにちは。

子プロセスでは、シリアル通信があったり、画面制御があったり、別々の処理を個個に行いたいのですが、そういった場合でもforkを使って子プロセスを作っていくやり方で問題ないでしょうか?

可能か不可能かという意味では可能です。fork()→exec()の流れです。
適切か不適切かという意味ではケースバイケースですが、それら複数のタスクが密接に連携して動作し、メモリ空間を共有した方が好ましい場合は、不適切です。そのような時はスレッドを使った方が効率は上がります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 10:29

    回答ありがとうございます。
    exec()について調べてみると、子プロセスで現在の処理を停止し新しいプログラムに置き換えて起動させるといったようなことが書かれていますが、たとえば、いくつもの子プロセスを作成し、そのなかで違う処理を行う関数を並列に動作させたい場合でもfork-execの方式を使って行うのでしょうか?。

    処理をいくつものプロセスに分割して、並列に動作させたい場合、Linuxのセオリーはどんなやり方なのかということが、しらべてもピンとこなかったのでこちらに質問させていただきました。

    キャンセル

  • 2018/10/23 17:10

    > いくつもの子プロセスを作成し、そのなかで違う処理を行う関数を並列に動作させたい場合でもfork-execの方式を使って行うのでしょうか?。

    その通りです。同じページの上の方に書かれていますが、shellでパイプを使う場合、各プロセスはfork-execで起動されるそうですよ。つまり、普通に使います。

    なお、回答でも書いたように、マルチタスクする方法は主にマルチプロセスとマルチスレッドの2種類があります。どちらを使うのが好ましいかはケースバイケースです。

    キャンセル

+1

一般的にいうマルチタスク

元のプロセスとデータ連携の必要があるでしょうか?
もし、ある場合は、パイプ等でデータのやり取りが必要となりますが、考慮されていますか?

また、組込みLinuxとの事ですが、一般のLinixとほぼ同じ場合、あるいは改造されて種々の制限がある場合がありますが、その辺は確認されていますか? 一般のLinuxとほぼ同じ場合は、一般のLinixの制限、そのままですが、用途によっては異なる場合もあります。まず、確認を。

質問の感じからすると、 Chironianさんの書かれたように、スレッドの方がよさそうですが、どうでしょうか。 (と言うものの、スレッドの詳細は忘れた)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 10:24

    回答ありがとうございます。調べてみるとプロセスに分割した場合、プロセスごとに独立したメモリ空間を持つと書いてあったので不具合を生じにくくてよいかなと思いました。
    処理をいくつものプロセスに分割して、並列に動作させたい場合、Linuxのセオリーはどんなやり方なのかということが、しらべてもピンとこなかったのでこちらに質問させていただきました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る