1.Linux查看进程
1.1ps aux 列出所用正在运行的进程的详细信息
1.2ps -ef 列出所用正在运行的进程的详细信息,以全格式显示
1.3Top 实时显示系统中正在运行的进程和系统性能信息
1.4Pstree 以树状结构显示进程之间的关系
1.5ps axj 显示当前进程以及进程之间的关系
2.什么是进程
2.1进程的概念
进程是程序一次动态执行过程,包括创建、调度、消亡
2.2进程和程序的区别
程序(a.out)是静态的,它是保存在磁盘是的指令的有序集合,没有任何执行概念
进程(./a.out)是动态的,执行时包括创建
2.3进程是程序执行和资源(内存)管理的最小单位
因为每个进程都有一个0~4G的虚拟内存
2.4进程的类型
(1)交互进程:有shell控制和运行,既能在前台运行也可以在后台运行·
前台运行:R+ 后台运行:R
(2) 守护进程:在后台运行,一般在系统启动是开始执行,系统关闭时才结束
(3)批处理进程:该进程不属于终端,它被提交到一个队列中以便顺序执行
2.5进程运行状态
(1) 运行态:此时进程正在运行或者准备运行
(2)等待态:此时进程等待一个事件的发生和某种系统资源
可中断· 不可·中断
(3)停止态:此时进程停止
(4)僵死态: 已经终止但还占有一个task_struct结构体
为了更好的管理Linux所访问的资源,系统在内核头文件include/linux/sched.h定义了进程控制块(PCB)结构体task_struct来管理每个进程的资源
内核空间进程资源即PCB相关的信息,包括进程控制块本身,打开的文件表项、当前目录、当前终端信息、线程基本信息、可以访问内存地址空间、PID、PPID、UID、EUID等,也就是说,内核通过PCB结构体可以访问到进程的所有资源信息
(5)死亡态:
2.6进程的模式
用户与内核
nice:按用户指定优先级运行进程
renice:改变正在运行优先级的进程
2.7进程相关的系统调用
进程创建
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
//创建进程
pid_t pid = fork();
//判断
if(pid < 0)
{
printf("fort error");
return -1;
}else if(pid > 0)
{
printf("i am father");
}else
{
printf("i am child");
}
return 0;
}
2.8.getpid getppid
else if(pid > 0)
{
while(1)
{
printf("i am father %d\n",getpid());
sleep(2);
}
}else
{
while(1)
{
printf("i am child %d %d\n",getppid(),getpid());
sleep(2);
}
2.9进程退出
exit(0) 不会刷新缓存区
_exit(0) 刷新缓存区
return 0;
3.0孤儿进程
父进程先于子进程退出,子进程会被systemd进程收养,子进程会变成后台进程
3.1僵尸进程
子进程先于父进程退出,父进程还没有来的及收回子进程资源(PCB结构体)
如何避免僵尸进程:子进程退出时父进程及时收回
调用wait和waitpid
wait使函数阻塞,知道任意一个子进程结束或收到某一信号
waitpid可以指定某一子进程以及等待的方式(阻塞或非阻塞)
exec函数组
以列表形式传参
3.守护进程
3.1特点
从系统启动开始运行,系统关闭时停止运行
后台进程与终端无关
3.2进程与终端关系
与终端不能有亲缘关系
把控制终端变成?
3.3守护进程创建
创建子进程,父进程退出
在子进程创建新会话
改变当前根目录
重设文件权限掩码
关闭文件表述符
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid < 0)
{
printf("fort error");
return -1;
}else if(pid > 0)
{
//父进程退出
exit(0);
}
//创建新绘画
setsid();
//更改根目录
chdir("/");
//重设文件权限掩码
umask(0777);
//关闭文件描述符
int i = 0;
for(i = 0; i < getdtablesize(); i++)
{
close(i);
}
while(1);
return 0;
}
4.通信的相关概念
4.1通信的模式
单工:A-->B (键盘输入)
半双工:A-->B 或者 B-->A
双工:A<-->B
同步:有规律、有顺序、有节奏
异步:无规律、无顺序、无节奏
4.2信号安装
void(*signal(int siganl,void(*handler)(int))(int);
//创建信号
//参数一:sigunm:指定函数
//参数二:SIG_IGN:忽略该信号
SIG_DFL:采用系统默认方式处理函数
自定义函数处理函数指针
//返回值:成功:设置之前的信号处理方式 失败:-1
4.3alarm
函数原型:unsigned int alarm(unsigned int secondes)
参数一:seconds:指定秒数
返回值:成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟的剩余时间,否则返回0
失败:-1
4.4pause
4.5kill
4.6raise
有名信号量
有名信号量:进程间的同步
无名信号量:线程间的同步
消息队列
- 创建并打开消息队列
- 添加消息
- 接收消息
- 删除消息队列
-
线程
- 线程的相关概念