进程间关系:进程组、作业、会话
进程组:
一组进程的集合,这组进程拥有相同的进程组id,可以接收来自同一终端的各种信号
创建一个进程组:
用sleep 100|sleep 200| sleep 300来创建三个进程,这三个进程属于一个进程组
这时我们发现他们的PGID都是2439 说明他们都在2439这个进程组
进程组组长退出进程组不会退出,只要进程组中一个进程存在,这个进程组就存在
扩充:ctrl+c 是将一个进程组退出,从前台切到了后台
"grep -E"显示文件中符合条件的字符
“grep -v grep" 在文档中过滤掉包含有grep字符的行
&代表进程在后台运行
S 代表休眠 s+ 里的+代表前台进程
作业:
有多个进程组成
作业和进程组的区别:如果一个作业中的某个进程创建了子进程,这个子进程不属于作业
终端作业:前台作业、后台作业
一个终端最多只有一个前台作业,但可以拥有多个后台作业,如果在前台新起作业,那么shell会转入后台无法执行
会话:
是一个或多个进程组的集合
会话被分为:控制进程(会话首进程)、一个前台进程组、多个后台进程组
每起一个终端都会起一个会话
终端(TTY)起来运行的第一个进程是bash,bash就是终端会话的首进程,SID就是首进程的ID
bash 是shell中的一种
一个会话不一定有终端
作业控制:
jobs可以查看这个终端里所有作业
fg +作业好号 可以将作业提到前端
ctrl+z使进程处于停止状态时,它对信号不做处理,此时若传来一个kill信号,它不做反映,但是一旦他被提到前台时(即运行时),会立即被结束掉、
关系总结:
守护进程
是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行
在父进程中创建一个子进程,让父进程退出,这样子作业就退出了子进程就转入后台运行
独立于一个终端就是要跳出一个会话,调用setsid()创建一个新的会话
存在意义:周期性的处理某种任务或等待处理某些放生的事件
头文件:#include<unistd.h>
pid_t setsid(void)
成功返回新创建的会话id,失败返回-1
注意!!调用这个函数之前,当前进程不允许是进程组的leader,否则该函数返回-1
调用守护进程函数
int daemon(int nochadir,int noclose);
nochadir:如果为0,更改工作路径到根目录,getcwd可以查看当前的工作路径
noclose:如果为0,将重定向标准输入、标准输出、标准错误到/dev/null