好友
阅读权限20
听众
最后登录1970-1-1
|
古月不傲
发表于 2020-12-23 20:31
本帖最后由 古月不傲 于 2020-12-23 20:43 编辑
守护进程
什么是守护进程?
运行于后台,没有关联终端的进程
基本特点
- 一般生存周期较长,与操作系统共存亡
- 无终端,所以终端关闭,也不会消亡
linux中存在很多的守护进程,维护系统的日常开销
- 相关概念
- 大多数守护进程都是以root用户特权运行
- 守护进程没有终端,所以TTY显示?
- 带有[]的属于内核守护进程,无控制终端方式启动,也就是说随操作系统启动
- 不带[]的属于用户守护进程
守护进程编写规则
- fork一个子进程,然后父进程退出(固定套路)
- 子进程调用setsid创建新会话,脱离TTY
- 调用umask(0),生成文件的所有权限
- 重定向STDIN_FILENO、STDOUT_FILENO,到/dev/null
文件描述符的一些概念
类似于windows的句柄,返回一个正数
三个特殊的文件描述符
0: 标准输入[键盘],STDIN_FILENO
1: 标准输出[屏幕],STDOUT_FILENO
2: 标准错误[屏幕],STDERR_FILENO
/dev/null(黑洞) 空设备,负责吞噬一切无关信息
// 重定向标准输入输出到黑洞
int fd;
fd = open("/dev/null", O_RDWR);
dup2(fd, STDIN);
dup2(fd, STDOUT);
if (fd > STDERR) {
close(fd);
}
守护进程不会收到的内核信号
- SIGHUP 连接断开
- SIGINT ctrl + c
- SIGWINCH 窗口大小发生变化
守护进程和后台进程的区别
测试
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int create_daemon()
{
int fd;
switch (fd = fork()) {
case -1:
return -1;
case 0:
break;
case 1:
close(fd);
exit(0);
}
if (setsid() == -1) {
return -1;
}
umask(0);
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
return -1;
}
if (dup2(fd, STDIN_FILENO) == -1) {
return -1;
}
if (dup2(fd, STDOUT_FILENO) == -1) {
return -1;
}
if (fd > STDERR_FILENO) {
close(fd);
}
return 0;
}
int main(void)
{
if (create_daemon() != 0) {
return -1;
}
while (1) {
printf("Hello Wolrd!\n");
}
return 0;
}
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|