c语言中fork,exec和system函数的理解

fork

用于创建子进程。

由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。

  1. 在父进程中,fork返回新创建子进程的进程ID。
  2. 在子进程中,fork返回0。
  3. 如果出现错误,fork返回一个负值。

包含在<unistd.h>中,是Unix系统特有的文件(Mac os并不太清楚),因此需要用gnu标准进行编译。

fork的作用是创建一个子进程。网上有不少博客,但其中有相当一部分并没有点明fork之后会怎么样。 实验证明:fork之后的子进程不是重新运行整个程序,而是从fork处接着向后运行。 比如下面的程序:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int sum=0,i;
    char cmd[1023][20], ch;
    int cnt=1, status;
    printf("before fork\n");
    while(cnt<=2) {
            pid_t id=fork();
            printf("father: id=%d, cnt=%d\n",id,cnt);
            if (id == 0) {
                printf("\e[33mSon\e[0m\n");
            }
        cnt++;
    }
    printf("\e[31mafter fork\e[0m\n");
    // printf("finally: id=%d\n",id);
    return 0;
}

其结果应该如下:(父进程和子进程之间没有固定的先后顺序,看运气)

如果画个进程运行图,应该是这样:

%%{ 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

流程如下:

  1. 程序从main进入,此时的身份我们假设为root
  2. 当运行到fork时,产生一个子进程sub1(此时cnt=1)。 两个进程都向后运行。父进程无其它输出,子进程输出Son
  3. rootsub1都进入下一轮循环, 此时cnt=2。这意味着rootsub1都会进行一次fork, 分别产生sub2sub3

c语言中fork,exec和system函数的理解
https://levsky-williams.top/posts/321f/
作者
Levski-Williams
发布于
2024年4月28日
许可协议