守护进程即我们平时所说的后台进程,它不占据终端,不受用户登陆注销的影响。
1、特点
(1) 后台服务进程。
(2) 独立于控制终端,终端名设置为?号。
(3) 周期性执行某任务。
(4) 不受用户登陆注销的影响。
(5) 一般采用以d结尾的名字(服务),比如:mysqld。
2、创建守护进程的步骤
(1)fork子进程,父进程退出(必须)
(2)子进程创建新会话(必须,setsid())
(3)改变当前工作目录chdir(非必须,建议做)
防止:插入了一个U盘,a.out,在U盘目录中启动,运行过程中,U盘拔掉了。
(4)重设子进程掩码(非必须)
增加子进程程序操作的灵活性(umask(0))。
(5)关闭文件描述符(非必须)
为了释放资源。
(6)执行核心工作(必须,非必须就没有意义了)
3、C语言代码实现
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <time.h> int main(int argc, char *argv[]) { pid_t pid = fork(); if (pid > 0) { exit(1); // 1.父进程退出 } else if (pid == 0) { // 2.变为会长,脱离了控制终端 setsid(); // 3.改变进程的工作目录 chdir("/~"); // 4. 重置文件掩码 umask(0); // 5. 关闭文件描述符 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // 6. 执行核心操作 int fd = open("/root/temp-deamon-log.txt", O_CREAT | O_WRONLY | O_APPEND, 0664); int i; for (i = 0; i < 100; i++) { sleep(3); time_t curtime; time(&curtime); char* pt = ctime(&curtime); write(fd, pt, strlen(pt) + 1); } close(fd); } return EXIT_SUCCESS; }
4、守护进程和nohup
(1) 从nohup源码就可以看到,其实nohup只做了3件事情
dofile函数将输出重定向到nohup.out文件。
signal函数设置SIGHUP信号处理函数为SIG_IGN宏(指向sigignore函数),以此忽略SIG_HUP信号。
execvp函数用新的程序替换当前进程的代码段、数据段、堆段和栈段。
execvp 函数执行后,新程序(并没有fork进程)会继承一些调用进程属性,比如:进程id、会话id,控制终端等。
(2) 在终端关闭后,nohup起到类似守护进程的效果,但是跟传统的守护进程还是有区别的
nohup创建的进程工作目录是你执行命令时所在的目录。
0 1 2 标准输入 标准输出 标准错误 指向nohup.out文件。
nohup创建的进程组中,除首长进程的父进程id变为1之外,其余进程依然保留原来的会话id、进程组id、父进程id,都保持不变。
文章出自:https://www.daixiaorui.com/read/292.html 本站所有文章,除注明出处外皆为原创,转载请注明本文地址,版权所有。
gg修改器https://www.guiyangtax.com/ 葫芦侠http://www.booj.net/ 八门神器http://www.tusovok.net/ 八门神器http://www.wj9898.com/
好听的名字http://www.timdurr.com/
王者荣耀免费刷10万点卷不封号http://www.sxjzxny.com/
什么都不要想 王者荣耀修改器下载http://www.sxjzxny.com/
腾不出时间来睡觉的人,迟早会腾出时间来生病;腾不出时间来恋爱的人,迟早会腾出时间来相亲 https://coincryptoradar.com