网站开发建设费用包括那些北京网站建设比较好的公司
web/
2025/9/27 12:18:06/
文章来源:
网站开发建设费用包括那些,北京网站建设比较好的公司,商城站到汤泉池,ico网站建设1 相关概念
1.1 守护进程的概念 守护进程也叫做精灵进#xff0c;是运行在后台的一种特殊进程。它独立于控制终端并且可以周期性的执行某种任务或者处理某些发生的事件。 守护进程是非常有用的进程#xff0c;在Linux当中大多数服务器用的就是守护进程。比如#xff0c;web…1 相关概念
1.1 守护进程的概念 守护进程也叫做精灵进是运行在后台的一种特殊进程。它独立于控制终端并且可以周期性的执行某种任务或者处理某些发生的事件。 守护进程是非常有用的进程在Linux当中大多数服务器用的就是守护进程。比如web服务器http等同时守护进程完成很多系统的任务。当Linux系统启动的时候会启动很多系统服务这些进程服务是没有终端的也就是你把终端关闭了这些系统服务是不会停止的它们一直运行着。它们有一个名字就叫做守护进程。 一般以服务器的方式工作对外提供服务的服务器都是以守护进程精灵进程的方式在服务器中工作的一旦启动之后除非用户主动关闭否则一直会在运行。 1.2 进程组和会话
进程组的相关概念
进程除了有进程的PID之外还有一个进程组进程组是一个进程或者多个进程组成。通常他们与同一作业相关联可以收到同一终端的信号每个进程组有唯一的进程组ID每一个进程组有一个进程组组长。如何判断一个进程是不是这个进程组的组长通常进程ID等于进程该进程组ID那么该进程就是该进程组的组长。
会话组的相关概念
会话是有一个或者多个进程组组成的集合一个会话可以有一个终端建立与控制终端连接的会话首进程被成为控制进程一个会话的几个进程组可以分为前台进程和后台进程而这些进程组的控制终端相同也就是sesion id是一样的。当用户使用Ctrl c 产生SIGINT信号时内核会发送信号给相应的前台进程组的所有进程。如果运行一个程序我想把它放到后台运行可以在可执行程序后面加一个如果想把后台进程提到前台可以使用fgjobs指令可以查看当前会话的后台进程将前台进程放到后台Ctrl z | bg 任务编号 观察现象 下面来介绍上述选项的意义 综上
我们在命令行中启动一个进程现在就可以叫做在会话中启动一个进程组来完成某种任务所有会话内的进程fork创建子进程一般而言依旧属于当前会话。
像平时当我们觉得Windows卡顿的时候我们可能会重新注销一下。注销就是让用户退出登录后再重新登陆那么此时就相当于给你新建一个会话。卡顿是因为你本次登陆过程中启动了很多任务且都属于同一个会话注销本质就是把你内部会话的所有进程组删掉。
注意
在登录的状态时新起了一个网络服务器创建好之后在派生的子进程也属于当前会话所以我们就不能让这个网络服务器属于这个会话内容要不然它会受到用户的登录和注销的影响。所以当我们有个网络服务的时候应该脱离这个会话让它独立的在计算机里自成进程组自成新会话。这样在两个用户同时登录的时候形成的两个会话是独立的在操作各自的bash不会相互影响。像这种自成进程组自成新会话而且周而复始的进程称为守护进程精灵进程。
2 守护进程的方式 我们这里有三种方式让自己的进程守护进程化 自己写daemon函数推荐使用这种方式用系统的daemon函数nohup命令 2.1 TCP网络程序守护进程化
之前的TCP网络程序是在前台运行的但是实际上服务器并不是在前台运行的而是在后台运行的。所以现在对TCP网络程序的代买进行修改加上一个小组件使其守护进程化让服务器在后台运行。编写daemon.hpp文件完成守护进程的主要逻辑具体如下
忽略一些不需要的异常信号防止进程被信号杀死如调用signal函数忽略SIGPIPE信号更改进程的工作目录选做fork创建子进程exit让父进程退出。让执行服务的进程不是进程组组长从而保证后续不会再和其他终端相关联调用setsid函数设置自己是一个独立的会话setsid不能设置进程组组长的进程将标准输入、标准输出、标准错误重定向到/dev/null一种文件不能写也不能读
进程守护化需要调用setsid()函数注意点如下
调用setsid创建新会话的目的是让当前进程自成会话与当前bash脱离关系创建守护进程的核心。调用setsid创建新会话时要求调用进程不能是进程组长但是当我们在命令行上启动多个进程协同完成某种任务时其中第一个被创建出来的进程就是组长进程因此我们需要fork创建子进程让子进程调用setsid创建新会话并执行后续代吗而父进程直接exit退出即可。此时子进程就不是组长进程了而是独立会话的守护进程。当服务端给客户端写入时但是客户端突然关掉了那就是向一个不存在的文件描述符写入此时服务端会收到SIGPIPE信号而自动终止所以我们要忽略该信号。当前进程有自己的工作目录有时候守护进程想要更改自己的工作目录一般会将守护进程的工作目录设置为根目录便于让守护进程以绝对路径的形式访问某种资源。我们可以使用chdir函数更改进程的工作目录不过此操作不做强求。守护进程不能直接和用户交互也就是说守护进程与终端去关联了因此一般我们会将守护进程的标准输入。标准输出、标准错误都重定向到/dev/null,/dev/null是一个字符文件设备类似于Linux的一个“文件黑洞”or“垃圾桶”通常用于屏蔽/丢弃输入输出信息。建议这么做
【daemon.hpp实现如下】
#pragma once#include cstdlib
#include cstring
#include signal.h
#include unistd.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
#include log.hpp
#include err.hpp//守护进程的本质孤儿进程
void Daemon()
{// 1. 忽略异常信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2. 创建子进程让子进程成为新的会话if (fork() 0)exit(0); // 父进程退出// 子进程// 3. 设置子进程为新会话pid_t id setsid();if (id 0){logMessage(Fatal, setsid error:%s\n, strerror(errno));exit(SETSID_ERR);}logMessage(Info, setsid successful.\n);//4. 可选更改工作目录//chdir(/);//5. 处理0,1,2的问题int fdopen(/dev/null,O_RDWR);if(fd0){logMessage(Fatal,open /dev/null error:%s\n,strerror(errno));exit(OPEN_ERR);}logMessage(Info,open /dev/null successful!\n);dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);
} 出现问题进程变成守护进程后打印的日志信息不见了要怎么办
解决问题日志持久化将日志输出追加打印到log.txt文件中! 最后一个步骤我们只需要在服务端的main函数命令行参数信息处理后调用此daemon函数即可 测试结果
现在我们运行服务端通过下面的监控脚本辅助观察信息
[xzyecs-333953 tcp]$ ps axj | head -1 ps axj | grep serverTcp
[xzyecs-333953 tcp]$ ps axj | head -1 ps axj | grep sshd 2.2 TCP网络编程代码
lesson25/tcp · 杰编程/LinuxCode - 码云 - 开源中国 (gitee.com)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82763.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!