情景解析:
执行以下代码:
#include<string.h>
#include<unistd.h>
int g_val = 100000;int main()
{int key=7;printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);sleep(5);pid_t id = fork();if(id == 0){//childwhile(1){printf("I am child process, pid: %d, ppid: %d, g_val: %d,key=%d\n", getpid(), getppid(), g_val,key);sleep(1);}}else{// fatherwhile(1){printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);sleep(1);}}
}
结果:
可以看到:
- 父进程的数据默认能被子进程看到并访问。(访问 ≠ 子进程不能修改)
- 我们发现父进程的pid一直在变化,但是ppid没有改变,一直都是2836
- 2836是谁❓就是命令行解释器☞bash进程
OS启动的时候都会启动一个进程☞bash进程
命令行中无论是启动自己的程序,还是系统程序。都会变成进程,起始都是bash的子进程。
命令行中输入的参数默认是输入给bash进程的获取的。
注意❗:系统指令程序和自己程序启动运行都是一样,并没有任何差别
bash进程把命令行参数表传给子进程两种方式
- 传参
- 父进程的命令行参数表(数据段)是可以被子进程共享的
流程:
- 登录Linux系统
- 创建bash进程
- 在命令行中输入参数
- bash进程获取参数的路径&可执行程序(怎么获取❓下篇)
- 创建子进程
- bash并把【命令行参数表】传给子进程main函数(传参 / 共享)
- 子进程接着执行自己的代码
注意:
- 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
- 每开启一个终端就会有1个bash进程。
- 一个用户也可以有多个bash进程。