进程
进程的概念
进程是一个程序执行的过程,会分配内存资源,cpu的调度
进程的状态
linux中分为 就绪态 运行态 睡眠态 暂停态 僵尸态
运行态包括用户运行态,内核运行态,睡眠包括可中断睡眠和不可中断睡眠
linux进程的查看
ps aux
进程和程序的区别
进程共享
0-3G 读时共享,写时复制
共享问价描述符 mmap建立的映射区
进程的分类
交互式进程
批处理进程
守护进程
进程的作用
完成并发任务
进程的调度
由内核调度,完成cpu的切换
进程的杀死
kill
僵尸进程
由父进程回收子进程pcb块,要不会占用大量资源
孤儿进程
会由1号进程接收,可用于创建守护进程
进程的退出
正常退出
exit _exit return
exit 与 _exit 的区别
exit会刷新io缓存 调用atexit注册的函数
关闭文件,而_exit只会关闭文件
atexit可以注册终止处理函数,终止处理程序的调用与注册顺序相反
return 和 exit的区别
return 是语言级别,表示了调用堆栈的返回 ,exit表示退出进程
在主函数中 return n 和 exit n相同 0表示正常退出
非0表示非正常退出
异常退出
两种 调用abort
由信号终止
进程空间的回收
子进程结束后由父进程回收子进程的pcb块
pid_t wait(int *status)
阻塞式 等待任意进程退出
通过status可以判断出是exit退出还是通过信号退出,并拿到退出的状态值
相关带参宏
exit退出
WIFEXITED(wstatus) //判断
WEXITSTATUS(wstatus) //获取值
signal退出
WIFSIGNALED(wstatus) //判断
WTERMSIG(wstatus) // 获取值
返回值 :
waitpid
pid_t waitpid(pid_t pid, int *wstatus, int options);
作用:wait的加强,通过阻塞或非阻塞的方式回收子进程
参数:
pid:
<-1 回收指定进程组
-1 回收任意子进程
0 回收组内任意子进程
>0 通过子进程pid回收
wstatus 同wait
options
0 表示阻塞等待
WNOHANG 表示非阻塞
返回值
0 指定进程没有结束
-1 失败
回收成功返回收到的pid
相关函数
进程的创建 fork
获取 pid ppid getpid getppid
子进程的回收 wait waitpid
exec族
作用:
用于在子进程中执行其他程序
当进程调用exec族函数时,该进程完全被新程序替代,exec并不创建新进程,但是system会创建
相关函数:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
参数:
path: 路径名 不写路径则表示当前路径
file: 程序名
argv: 表示用数组传递所有参数,其中最后一个参数值为NULL
注意事项:
调用该族函数后,该进程被完全替换,但是存在调用失败的情况,所以通常在
调用后还要进行相应判断处理
守护进程
特征: 脱离终端 后台长期执行
相关概念:
前台进程:
后台进程
session会话:当登录linux系统时即开启了一次会话,并被分配到一个终端,会话id为该会话首id.
控制终端:
终端与伪终端
终端即 tty1 tty2 ....tty7 ,用户界面一般为tty1
用户界面的终端控制器为伪终端。
每个会话可以有一个控制终端,但不是所有会话都拥有终端。
进程组:
当一个程序在执行时会产生一个进程组,首进程id为进程组id, 如 ps aux |
grep a.out,即开启了两个进程组。
守护进程的创建:
1.创建孤儿进程
即需要创建一个后台进程,在形式上脱离终端控制,前台交互进程受到终端的限制,
并且进程组组长不能用于创建新的会话。
2.在子进程中调用setsid
即让该子进程成为一个新的会话的会话id,并成为新的进程组组长。
3.修改子进程工作路径
chdir("/");
因为子进程继承了父进程的工作路径,但是守护进程通常执行一些系统任务,所以将
工作路径切换到根目录。
4.调用umsak函数,设置进程的文件权限掩码为0
目的:增强守护进程的灵活性,可以创建出任意权限文件。
5.在子进程中关闭不需要的文件描述符
由于子进程继承了父进程的打开了的文件,而子进程用不到这些序偶一需要关闭
关闭 文件描述符 0 - 1023
守护进程的验证:
守护进程的退出:
通过kill发送信号退出守护进程
注意事项:
通常需要root权限运行
拓展
linux内核的五大组成部分
内存管理:
进程管理:
进程间通信:
虚拟文件系统:
网络接口
推荐阅读:https://blog.csdn.net/xiezhi123456/article/details/80250100