检测网站点击量,网上怎么注册网址,河北邢台专业做网站,wordpress 判断手机版文章目录 1. 补充1.1 查看1.2 控制进程组的方式 2. 创建守护进程step1. 忽略信号step2. 让自己不是组长step3. setsid 函数#xff1a;给调用函数设置新的会话和进程组 IDstep4. chdir 函数#xff1a;可以改变守护进程的工作路径step5. 处理文件描述符 0、1、2 守护进程类样… 文章目录 1. 补充1.1 查看1.2 控制进程组的方式 2. 创建守护进程step1. 忽略信号step2. 让自己不是组长step3. setsid 函数给调用函数设置新的会话和进程组 IDstep4. chdir 函数可以改变守护进程的工作路径step5. 处理文件描述符 0、1、2 守护进程类样例 1. 补充
1.1 查看
为了观察进程我们以在命令提示符处运行 sleep 命令为例。
ps axj | head -1 ps axj | grep sleep | grep -v grep得到的信息 PPID父进程 ID PID进程 ID PGID进程组 SID会话 ID TTY进程关联的终端 每登录一次都是一个新的会话即每个会话关联一个终端文件进程组的名称是进程组中第一个进程的 PID。
进程组分为前台任务和后台任务在会话中只能有一个前台任务在运行 解释了我们在命令行启动一个进程的时候bash 就无法工作了的原因每次登录就是创建一个新的会话、bash 任务启动进程就是在当前会话中创建一个后台任务退出会话会影响会话内部的所有任务一般网络服务器为了不受到用户的登陆注销的影响网络服务器会以 守护进程 的方式运行
1.2 控制进程组的方式
jobs查看自己会话中后台运行的进程 fg [任务号]将相应进程提到前台 ctrl Z将前台运行的进程暂停并放入后台 bg [任务号]运行后台暂停的进程 2. 创建守护进程 为了不受用户影响网络服务器会将其进程单独拎出来使用新的会话和进程组为此称守护进程 step1. 忽略信号
signal(SIGPIPE, SIG_IGN);
signal(SIGCHLD, SIG_IGN);
// ...step2. 让自己不是组长
要设置新的会话和进程组 ID需要使用 setsid 接口而每个进程组的组长进程组号同自己 PID 的进程是不能舍自己进程组不顾的即使用 setsid 创建新组必须不能是组长。
if (fork() 0) exit(0);fork出多进程让父进程退掉子进程继续跑就相当于让出了组长。 本质上守护进程就是 孤儿进程 的一种
step3. setsid 函数给调用函数设置新的会话和进程组 ID #include unistd.hpid_t setsid(void); 返回值 成功返回新的进程组 ID失败返回 -1并设置错误码 注意组长是不能使用该接口的
step4. chdir 函数可以改变守护进程的工作路径
非必要步骤 #include unistd.hint chdir(const char *path);返回值 成功返回 0失败返回 -1并设置错误码 step5. 处理文件描述符 0、1、2
这里的处理是将这些文件重新向到 /dev/null 中目的是切断新会话和键盘等的联系。
这里的 /dev/null 是一个字符设备传进的数据都会被直接丢弃。
守护进程类样例
#include cstdlib
#include unistd.h
#include signal.h
#include sys/types.h
#include sys/stat.h
#include fcntl.hvoid Daemon()
{// 1. 忽略信号signal(SIGPIPE, SIG_IGN);signal(SIGCHLD, SIG_IGN);// 2. 让自己不要成为组长if (fork() 0)exit(0);// 3. 新建会话自己成为会话的话首进程pid_t ret setsid();if ((int)ret -1){// 日志或打印exit(1);}// 4. 可选可以更改守护进程的工作路径// chdir(/)// 5. 处理后续的对于0,1,2的问题int fd open(/dev/null, O_RDWR);if (fd 0){// 日志或打印exit(2);}dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);
}如果本文对你有些帮助请给个赞或收藏你的支持是对作者大大莫大的鼓励(✿◡‿◡) 欢迎评论留言~~