tips:
task_struct就是linux下的PCB
操作系统不相信任何外部用户,而是只提供窗口,不可能直接与用户打交道,而是通过操作系统
tast_struct用来描述所有进程,用来管理
; 和 && 可以同时跑两个命令
进程可以分为两种
一种跑完自动退
一种要用户自己退出 常驻进程
PID
,进程的标识码,与其他进程区分
同一程序,关闭又打开后PID会变
但同一次启动中,PID是保持不变的
库函数获取自己pid
库函数头文件:sys/types.h
pid_t getpid(void)
pid_t getppid(void)
kill -9 pid 结束进程
ps ajs 查看所有进程
根目录下proc目录
会根据实际进程情况实时更新
/proc目录不是磁盘级文件
关闭电脑,/proc数据会消失
启动电脑,/proc会重新加载
/proc目录不存储在磁盘,不占用磁盘空间,而是在内存,只是在磁盘提供了类似快捷方式的引用。
/proc/[pid] 存放了进程属性
exe属性相当于getppid返回值
cwd属性,
非常重要
current work dir 当前工作目录
cwd记录进程文件启动时路径
chdir(newdir) 更改本程序cwd为dir
多进程
命令行中,执行命令/程序,本质是bash进程,创建的子进程,子进程执行了我们的代码
xshell开了几个窗口,就有几个bash
fork
是个库函数, 要systypes.h头文件
使用系统调用,创建进程
pid_t fork(void)
fork后,会变成两个进程,两个进程为父子关系,代码是共享的,数据是各自私有一份的
fork在父子进程中返回值不同
进程=内核数据结构+代码和数据
fork后子进程会继承父进程代码(代码共享)
进程间数据独立,保证了进程间互不干扰,有很强独立性,即便是父子,即使是全局变量。
创建多进程,多进程间应为一父对多子,这样父可有多子的pid,方便管理
创建多进程demo
#include <iostream>
#include <vector>
#include <sys/types.h>
#include <unistd.h>
using namespace std;const int num = 10;void SubProcessRun()
{while(true){cout << "I am sub process, pid: " <<getpid() <<" ,ppid: " << getppid() << std::endl;sleep(5);}
}int main()
{vector<pid_t> allchild;for(int i = 0; i<num; i++){pid_t id = fork();if(id == 0){// 子进程SubProcessRun();}// 这里谁执行?父进程一个人allchild.push_back(id);}// 父进程cout << "我的所有的孩子是:";for(auto child: allchild){cout << child << " ";}cout << endl;sleep(10);while(true){cout << "我是父进程,pid: " <<getpid() << endl;sleep(1);}return 0;
}
理解创建子进程
创建子进程时,子进程的task_struct是拷贝自父进程的,之后调整新的task_struct部分属性