c语言中fork,exec和system函数的理解
fork
用于创建子进程。
由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。
- 在父进程中,fork返回新创建子进程的进程ID。
- 在子进程中,fork返回0。
- 如果出现错误,fork返回一个负值。
包含在<unistd.h>
中,是Unix系统特有的文件(Mac os并不太清楚),因此需要用gnu标准进行编译。
fork的作用是创建一个子进程。网上有不少博客,但其中有相当一部分并没有点明fork之后会怎么样。 实验证明:fork之后的子进程不是重新运行整个程序,而是从fork处接着向后运行。 比如下面的程序:
其结果应该如下:(父进程和子进程之间没有固定的先后顺序,看运气)
如果画个进程运行图,应该是这样:
%%{ init: { 'flowchart': { 'curve': 'linear' } } }%%
flowchart LR
classDef main fill:#f96
classDef sub1 fill:#56b800
classDef sub2 fill:#7abceb
classDef sub3 fill:#ebe01a
root(root):::main-->a(fork)
a:::main-->c((dad)):::main
c-->d(fork):::main
d-->e((dad)):::main
a-->b((son)):::sub1
d-->f((son)):::sub2
b-->g(fork):::sub1
g-->h((subdad)):::sub1
g-->i((son)):::sub3
流程如下:
- 程序从main进入,此时的身份我们假设为root。
- 当运行到
fork
时,产生一个子进程sub1(此时cnt=1
)。 两个进程都向后运行。父进程无其它输出,子进程输出Son
- root和sub1都进入下一轮循环,
此时
cnt=2
。这意味着root和sub1都会进行一次fork
, 分别产生sub2和sub3。
c语言中fork,exec和system函数的理解
https://levsky-williams.top/posts/321f/