c语言中fork,exec和system函数的理解
fork
用于创建子进程。
由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。
- 在父进程中,fork返回新创建子进程的进程ID。
- 在子进程中,fork返回0。
- 如果出现错误,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;
}
其结果应该如下:(父进程和子进程之间没有固定的先后顺序,看运气)
如果画个进程运行图,应该是这样:
流程如下:
- 程序从main进入,此时的身份我们假设为root。
- 当运行到
fork
时,产生一个子进程sub1(此时cnt=1
)。
两个进程都向后运行。父进程无其它输出,子进程输出Son
- root和sub1都进入下一轮循环,
此时cnt=2
。这意味着root和sub1都会进行一次fork
,
分别产生sub2和sub3。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!