我在Windows上使用gcc-linux-4.1(CygWin的交叉编译器)在CygWin中构建了我的RTAI-model-source(由simulink生成),并成功生成了ELF。 ELF在Ubuntu上运行正常。
ELF在Ubuntu上正确运行后,系统监视器中有四个同名但不同process-id的进程。
但是如果我在gcc
Linux 上构建我的源代码,它只会生成 1 个进程,所以我认为fork()
或者exec()
可能不会被调用。
一个exec文件如何创建四个进程?
演出节目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
某些进程在执行后创建自身的其他副本是完全正常的,通常是为了通过并行执行来提高性能。至于它是如何工作的,进程 fork(2) 的(它可能也可能不执行 exec(2) 自身的另一个副本,具体取决于它的实现方式)。参见man 2 fork
和man 2 exec
。
本质上,Linux 中的新进程首先被创建为使用 fork(2) 调用它们的程序的副本。之后,他们可以使用 exec(2) 替换其进程映像。例如,这是使用 shell 执行命令时的常见工作流程。如果是同一个进程,则可能没有后续的 exec —— 也可以执行以处于某个子进程为条件的代码,而不必执行。
剑桥大学有关于这是如何工作的一个很好的页面如果您想了解更多信息。