前言:
大家新年快乐!这篇文章是网络编程的第一篇文件,是对网络UDP,TCP,序列化反序列化的一些总结,应用层协议。
如果我们在Xshell上启动一个服务器程序,正常情况下是前台进程,加上&会变成后台进程。但是当我们关闭Xshell终端的时候,前台进程会关闭,后台进程会受影响。而且服务器是要长期运行,不能关闭的。
●无控制终端:脱离控制终端,避免收到终端的干扰,它是和客户端进行交流的。和Xshell终端摆脱了联系。
●不占用前端资源:Xshell只允许一个前台进程存在,守护进程不占用前台资源,能正常bash执行其他指令。
特性 | 前台进程 | 后台进程 | 守护进程 |
---|---|---|---|
终端依赖 | 必须绑定终端(TTY) | 可脱离终端(但属于当前会话session) | 完全脱离终端和会话session |
用户交互 | 支持终端输入输出 | 无输入,输出可重定向 | 无输入输出(LOG日志记录) |
生命周期 | 终端关闭则关闭 | 会话终止则终止 | 系统关闭则关闭 |
1.一个终端只能有一个前台进程,0个或者多个后台进程。
2.当有前台进程时,bash进程会被换到后台。此时输入的命令是给此时在运行的前台进程。当前运行的前台进程不接收处理输入的命令,所以不能执行命令。
PPID:父进程。
PID:当前进程ID。
PGID:进程组ID。
SIG:与哪个会话相连(Session)。
TTY:与哪个终端相连。
TPGID:控制终端的前台进程组ID。是哪个终端打开的。
STAT:表示状态,+表示前台进程。
我们用xshell登录进行连接,就是创建了一个会话Session。前台进程和后台进程本质还是属于同一个session,断开连接的时候,前台进程会退出,后台进程会受影响,可能是报错。
守护进程是脱离当前会话Session,形成了一个独立的Session。
1.守护进程脱离终端,是网络进行IO。
2.守护进程是孤儿进程。
#include <unistd.h> int daemon(int nochdir, int noclose); 自动变成守护进程。
参数解释:
nochdir:
若为 0,进程的工作目录会改为根目录 /;
若为 1,保持当前工作目录。
noclose:
若为 0,将标准输入、输出、错误(stdin/stdout/stderr)重定向到 /dev/null;(黑洞级文件)
若为 1,保留原有文件描述符。
#include <unistd.h> pid_t setsid(void); 手动转化为守护进程 调用成功以后,就形成一个新的会话,如果调用进程原本关联了一个控制终端(如Shell终端),调用
setsid
后,它将与该终端完全分离。
进程组的组长不能变成守护进程
创建子进程,父进程退出,子进程向后运行,子进程就不是进程组组长了。
因为守护进程没有与终端关联,没有输入,输出。所以要把标准输入,标准输出,标准错误全部重定向。
/dev/null是黑洞文件。
int fd = ::open(devnull, O_WRONLY);
if (fd > 0)
{
// 各种重定向
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
close(fd);
}
如果是不需要重定向,直接关闭就可以了。
::close(0);
::close(1);
::close(2);
守护进程要对一些退出信号进行忽略:
signal(SIGCHLD, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
SIG_ING:忽略信号。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有