linux进程控制
进程相关概念
程序和进程的概念:
程序: 是编译好的二进制文件, 存放在磁盘上, 占用的是磁盘空间, 是一个静态的概念. ? 进程: 一个启动的程序, 需要占用系统资源: 如 内存, cpu 终端 等 ? 剧本--->程序 ? 进程--->唱戏(舞台, 灯光, 道具, 人等资源) ? 同一个程序可以在多个终端执行, 类似与同一台戏可以在多个舞台演出. ? 没启动一个程序都会有一个进程PID, 即使是相同的程序多次启动也会有个不同的PID.
并行和并发的概念:
并发: 在一个时间段内, 一个CPU上, 有多个程序在执行. ? 并行: 在一个时间片内, 有多个程序在执行(前提是有多个cpu) ? cpu会将一个大的时间段分成多个小的时间片, 让进程轮流使用CPU的时间片.
pcb
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
pcb的内部成员
进程id:系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
进程的状态:进程的状态,有就绪、运行、挂起、停止等状态。
进程切换时需要保存和恢复的一些CPU寄存器
描述虚拟地址空间的信息
当前工作目录
umask掩码
文件描述符
等等
进程状态
进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。
创建进程
fork函数
函数作用:
创建子进程,父进程调用fork创建一个子进程,子进程的用户区和父进程的用户区完全一样,但是内核区不完全一样,进程pid不一样
函数原型:
pid_t fork(void)
返回值:
调用成功:父进程返回子进程的PID,子进程返回0
错误: 返回-1,设置error值
并不是一个进程返回两个值,而是由父子进程各自返回一个值。
子进程创建成功后,代码的执行位置:
父进程执行到哪里子进程就执行到哪里
如何区分父子进程:
通过fork函数的返回值来却别
父进程和子进程谁先执行:
谁先抢到cpu时间片谁先执行
父子进程能否共享变量
父子进程不能共享全局变量,如果父子进程只是对全局变量做读操作,则父子进程在内存中只有一份。如果父子进程的任意一个进程对该变量进行修改操作,则会在内存中拷贝一个副本,然后在副本上修改,再映射回去。
————写时复制,读时共享
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/types.h>
4 #include<unistd.h>
5 int test = 99;
6
7 int main()
8 {
9 //创建子进程
10 pid_t pid = fork();
11 if(pid<0)
12 {
13 perror("fork error\n");
14 }
15 else if(pid >0)//父进程
16 {
17 test++;
18 }
19 else if(pid == 0)
20 {
21 sleep(1);//为了让父进程先结束
22 printf("test=%d\n",test);
23 }
24 return 0;
25 }
?
但是变量的地址是一样的,因为是虚拟内存地址。
ps命令和kill命令
ps aux | grep "xxx"
?
ps ajx | grep "xxx"
a(all)表示当前系统所有用户的进程
u 查看进程所有者及一些其它信息
x 显示没有控制终端的进程(不能与用户交互的进程)
j 列出与作业控制相关的信息
kill -l 查看系统有哪些信号
kill -9 pid -9是kill中的一个信号
getpid/getppid
getpid:得到当前进程的PID
函数原型:
pid_t getpid(void);
getppid :得到当前进程的父进程的PID
pid_t getppid(void)