1、什么是进程?
1)Linux操作系统可以同时加载多个进程,哪操作系统怎么管理进程?
先描述!再组织!
想要管理一个进程,首先要得到这个进程的状态,这就是描述进程。
那我们平时在c语言中是怎么描述一个对象的呢?
struct student
{
int age;
int weight;
int height;
}
在c语言中我们用这样一个结构体来描述一个学生对象,在Linux中同样如此。(Linux的底层实现使用的是c语言)
Linux操作系统中用类似于上面的PCB结构体描述每一个进程
2)PCB结构体中包含了进程的什么属性?
PCB:process control block 这是操作系统中对所有进程控制块的统称
在Linux下PCB是 task_struct
task_struct中包含:
标示符:唯一标识本进程的标示符,用来区别其他进程
状态:任务状态,退出代码,退出信号等
优先级:相对于其他进程的优先级
进程计数器:程序即将被执行的下一条指令的地址
内存指针:包括程序代码的进程相关数据的指针,还有其他进程共享的内存块的指针
上下文数据:进程执行是处理器的寄存器中的数据
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
3)当一个程序开始执行,那他就变成了一个进程,所以
进程=进程对应的PCB结构体+对应的代码加数据
2、组织进程
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6
7 while(1)
8 {
9 printf("hello world!\n");
10 sleep(1);
11 }
12
13 return 0;
14 }
在Linux下写用vim一段如上代码
当这样程序在Linux上跑起来时,我们就可以观察这个进程了
使用ps命令查看当前进程,但ps指令默认显示当前终端进程,若是查看所有进程,需要用 axj选项
怎么找到我要的进程?
使用行文本过滤工具
还可以通过head命令打印头部信息
其中PID就是这个进程的id,我们同样可以通过PID找到这个进程
此外,top命令ls /proc命令都可以查看进程
其中cwd是当前进程的工做目录
exe是可执行程序的位置
系统调用:
gitpid 获得进程的pid
man getpid
运行如下代码,获得进程pid
当我们知道了进程的pid之后,我们就可以通过 kill -9 pid 杀死进程
getppid 就可以获得一个进程的父进程pid
对比:
那么问题来了,a.out这个程序是我通过 ./ 运行起来的,那么谁是他的父进程?
让我们来找一下:
a.out的父进程是bash,其实bash就是我所使用的xshell外壳程序
通过系统调用创建子进程:
pid_t fork();
返回值:
失败:返回-1
成功:将子进程的pid返回给父进程,返回0给子进程
运行这一段代码会得到什么?
fork之后的语句怎么执行了两次?