Windowsでは、gcc-linux-4.1(CygWinのクロスコンパイラ)を使用してCygWinでRTAIモデルソース(simulinkで生成)を構築し、ELFを正常に作成しました。 ELFはUbuntuでうまく動作します。
ELFがUbuntuで正しく実行されると、システムモニタに名前は同じですが、プロセスIDが異なる4つのプロセスがあります。
ただし、gcc
Linuxでソースを構築すると、プロセスは1つだけ生成されるため、呼び出されないことがfork()
あります。exec()
1つの実行可能ファイルから4つのプロセスを作成するには?
パフォーマンスps -elF
:
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 3679 3314 0 57 - - 4362 hrtime 17:44 pts/1 00:00:00 /root/Test/test
5 S root 3680 3679 0 57 - - 4362 poll_s 17:44 pts/1 00:00:00 /root/Test/test
5 S root 3681 3680 0 56 - - 4362 rt_sch 17:44 pts/1 00:00:00 /root/Test/test
5 S root 3682 3680 0 -40 - - 4362 rt_sch 17:44 pts/1 00:00:00 /root/Test/test
答え1
一部のプロセスでは、通常、並列実行によるパフォーマンスを向上させるために、実行後に独自のコピーをさらに作成することは完全に正常です。動作方法に関しては、プロセスは forks(2) のものです (実装方法によって exec(2) 自体の他のコピーを実行することも、実行しないこともあります)。man 2 fork
とを参照してくださいman 2 exec
。
デフォルトでは、Linuxの新しいプロセスは最初にfork(2)を使用してそれを呼び出すプログラムのコピーとして作成されます。その後、exec(2)を使用してプロセスイメージを置き換えることができます。たとえば、これはシェルを使用してコマンドを実行するときの一般的なワークフローです。同じプロセスの場合は、後続の実行がない可能性があります。実行しなくても、子プロセスにあることを条件とするコードを実行することもできます。
ケンブリッジ大学はこれがどのように機能するかについての良いページがありますより多くの情報を知りたい場合。