linux进程控制

linux进程控制

进程相关概念

程序和进程的概念:

程序: 是编译好的二进制文件, 存放在磁盘上, 占用的是磁盘空间, 是一个静态的概念. ? 进程: 一个启动的程序, 需要占用系统资源: 如 内存, cpu 终端 等 ? 剧本--->程序 ? 进程--->唱戏(舞台, 灯光, 道具, 人等资源) ? 同一个程序可以在多个终端执行, 类似与同一台戏可以在多个舞台演出. ? 没启动一个程序都会有一个进程PID, 即使是相同的程序多次启动也会有个不同的PID.

并行和并发的概念:

并发: 在一个时间段内, 一个CPU上, 有多个程序在执行. ? 并行: 在一个时间片内, 有多个程序在执行(前提是有多个cpu) ? cpu会将一个大的时间段分成多个小的时间片, 让进程轮流使用CPU的时间片.

pcb

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。

pcb的内部成员

进程id:系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。

进程的状态:进程的状态,有就绪、运行、挂起、停止等状态。

进程切换时需要保存和恢复的一些CPU寄存器

描述虚拟地址空间的信息

当前工作目录

umask掩码

文件描述符

等等

进程状态

进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。

linux进程控制

 

 

创建进程

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)

linux进程控制

上一篇:When you received Ubuntu...


下一篇:CentOS、Ubuntu的下载安装