守护进程即我们平时所说的后台进程,它不占据终端,不受用户登陆注销的影响。
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