当前位置: 首页 > news >正文

一站式服务就像一个什么网站建设与维护1997年

一站式服务就像一个什么,网站建设与维护1997年,京推推cms网站建设,程序员最吃香的5个岗位目录标题 什么是守护进程会话的理解setsid函数daemonSelf函数模拟实现测试 什么是守护进程 在前面的学习过程中我们知道了如何使用TCP协议和UDP协议来实现通信#xff0c;比如说登录xshell运行了服务端#xff1a; 然后再登录一个xshell运行客户端并向服务端发送信息#… 目录标题 什么是守护进程会话的理解setsid函数daemonSelf函数模拟实现测试 什么是守护进程 在前面的学习过程中我们知道了如何使用TCP协议和UDP协议来实现通信比如说登录xshell运行了服务端 然后再登录一个xshell运行客户端并向服务端发送信息 服务端就会将接收到的消息打印出来 但是这里就存在这么一个疑问我们把运行服务端的xshell关掉这里的通信还能正常的实现吗 可以看到把运行服务端的xshell关闭之后客户端也会跟着出现问题那么这是不符合我们的预期的我们希望看到的是服务端的运行不受xshell的登录或者注销的影响除非我们手动的使用kill指令将其关闭那么我们把不受用户登录或者注销的进程称之为守护进程那么本篇文章就要将我们之前写的程序变成守护进程。 会话的理解 首先我们的linux服务器就就是下面图片的一个大方框xshell就是下面图片中的一个小方框 每当我们登录xshell的时候xshell就会在linux主机上创建一个会话在会话里面就有一个进程用来做命令行解释器也就是bash 然后在这个会话里面我们还可以创建其他的进程也可以叫做任务或者作业 在一个会话里面只能同时存在一个前台任务和一个或者多个后台任务比如说当前的前台任务就是命令行解释器bash我们可以通过bash执行各种指令 但是将TCP的服务端运行之后我们可以看到这些指令是无法执行了 那么这就是因为一个会话只能有一个前台进程运行了服务端可执行程序之后服务端就变成了前台bash就来到了后台所以这个时候我们输入的指令是无法被bash读取的我们先让程序终止然后在运行程序的指令后面添加符号就可以让一个程序在后端运行不影响bash的指令读取 使用jobs指令可以查看当前会话有几个后台进程正在运行因为我们就运行了一个所以下面的图片就只显示了一个 我们可以再使用sleep指令在后台多运行几个进程然后就可以看到jobs显示的后台任务会变多 最前面的数字表示这是几号作业tcpserver就是2号作业sleep 3 4 5就是3号作业sleep 6 7 8就是4号作业数字后面的Running就表示当前的作业是运行状态使用grep指令查看进程就可以看到下面这样的内容 仔细的观察不难发现进程sleep3 4 5的pid分别为3574 3575 3576是一段连续数字进程sleep 6 7 8的pid分别为3651 3652 3653又是另外一段连续的数字进程的pid如果是连续的话就说明这些进程之间的关系是兄弟关系这些兄弟进程就属于同一个进程组也就是说sleep345是一个进程组sleep678又是另外一个进程组一个进程组中可能会存在多个兄弟进程但是一个进程组中必须得有一个老大这个老大就是进程组中第一个被创建的进程大家网上翻一下就不难发现sleep 30000是进程组中第一个被创建的sleep 60000也是进程组中第一个被创建每个进程都有一个PGID来记录当前组的组长是谁如果自己的PID和PGID相等的话就说明你就是组长该组其他的兄弟进程的PGID就记录着你的PID 一个进程组的所用成员共同来完成一个作业这就好比工地中的甲方会讲工地上的各种任务分给多个包工头那么包工头就是组长包工头又会号召很多其他的工人来共同完成不同的任务。图片中还有一个SID 虽然当前的sleep进程分为两个不同的进程组但是这些进程组成员的SID都是一样的都为2373那么这个SID就是xshell给我们创建的会话idSID的全称就是session id。使用指令fg加作业号可以将后台的作业调整到前台来运行 使用ctrl z就可以将前台作业全部暂停暂停之后就会默认将bash调到前台继续运行并且通过jobs指令也可以看到3号作业的状态由之前的running变成stoped 使用指令bg加作业号就可以将后台暂停的作业变成运行状态 所以通过上面的实验我们证明了一个会话中可以存在多个进程这些进程中只能有一个是前台进程但是可以有多个后台进程并且不同的进程可以通过指令来做到前后台转换创建一个会话的时候会创建多个进程或者作业那么当我们关闭xshell时这个会话就会被销毁那销毁之后这个会话创建出来的是前台进程还是后台进程都将不复存在这也是为什么上面xshell关闭之后服务端不能正常运行的原因那么要想服务端不受xshell关闭的影响我们就得自成会话自成进程组和终端设备无关就好比要想不受老板的骂要想不被强制加班就得主动辞职自己创建一个公司当老板 setsid函数 实现守护进程有很多的方式其中操作系统以及给我们提供了专门用来实现守护进程的接口deamon 但是该接口在实现的过程中会遇到很多未定义的问题所以我们接下来在实现守护进程的时候就不使用该接口而是自己模拟实现一个daemon函数。要想实现守护进程就必须得调用setsid函数 该函数的作用就是哪个进程调用setsid函数哪个进程就能够自成一个会话会话的id就是该进程的pid该进程也就变成了组长进程调用该函数有一个前提就是该进程不能是组长只有非组长进程才能调用setsid函数这就好比只有普通员工跳槽辞职创建公司当老板哪有公司老板辞职又去创建公司的呢 daemonSelf函数模拟实现 该函数我们主要完成下面三件事情第一让调用进程忽略掉异常的信号因为有些客户端可能会搞事情比如说客户端给服务端发送了一条消息服务端刚准备发送一条消息给客户端时客户端就关闭这就好比向一个已经关闭的文件中写入内容这时就会收到异常的信号从而影响到服务端的运行所以第一步就是忽略掉一些异常信号第二因为组长进程无法调用setsid函数所以第二件事就是如何让当前的调用进程不再是组长。第三因为守护进程是脱离终端的那所以就不需要向终端的上面显示数据和读取数据所以就需要关闭或者重定向之前进程默认打开的一些文件。 void daemonSelf() {//忽略掉一些异常信号//让自己不再是组长//关闭之前默认打开的文件 }第一件事情很简单直接使用signal函数将SIGPIPE信号忽略即可 void daemonSelf() {//忽略掉一些异常信号signal(SIGPIPE, SIG_IGN);//让自己不再是组长//关闭之前默认打开的文件 }对于第二件事我们可以创建使用fork函数创建一个子进程因为父进程先被创建所以他就是组长子进程不是那么我们就可以通过if语句和exit让父进程直接退出子进程执行setsid函数setsid可能会执行失败所以创建一个变量记录函数的返回值并判断会不会出现错误 void daemonSelf() {//忽略掉一些异常信号signal(SIGPIPE, SIG_IGN);//让自己不再是组长 if (fork() 0)exit(0);// 子进程 -- 守护进程精灵进程本质就是孤儿进程的一种pid_t n setsid();assert(n ! -1);//关闭之前默认打开的文件 }第三件事我们不能直接关闭默认打开的0 1 2文件因为我们不能完全保证调用的程序中不会向这些文件发送或者读取问题一旦出现了就可能会出现问题所以我们这里就采用这样的方法系统中存在这么一个文件/dev/null他是一个黑洞文件任何进程都可以向他发送任何的数据但是任何进程也不能从这个文件中读取到任何的数据 所以为了防止出现上面所述的问题我们可以将0 1 2重定向到黑洞文件里面所以我们这里先使用open函数打开黑洞文件如果打开成功就使用dup2重定向如果打开失败就只能关闭0 1 2那么这里的代码如下 #define DEV /dev/nullvoid daemonSelf(const char *currPath nullptr) {// 1. 让调用进程忽略掉异常的信号signal(SIGPIPE, SIG_IGN);// 2. 如何让自己不是组长setsidif (fork() 0)exit(0);// 子进程 -- 守护进程精灵进程本质就是孤儿进程的一种pid_t n setsid();assert(n ! -1);// 3. 守护进程是脱离终端的关闭或者重定向以前进程默认打开的文件int fd open(DEV, O_RDWR);if(fd 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}else{close(0);close(1);close(2);} }完成了上面三步我们就基本上实现了该函数的主要内容但是在函数最后我们还可以做一些其他的事情比如说切换当前进程的执行路径等等那么完整的代码就如下 #pragma once#include unistd.h #include signal.h #include cstdlib #include cassert #include sys/types.h #include sys/stat.h #include fcntl.h#define DEV /dev/nullvoid daemonSelf(const char *currPath nullptr) {// 1. 让调用进程忽略掉异常的信号signal(SIGPIPE, SIG_IGN);// 2. 如何让自己不是组长setsidif (fork() 0)exit(0);// 子进程 -- 守护进程精灵进程本质就是孤儿进程的一种pid_t n setsid();assert(n ! -1);// 3. 守护进程是脱离终端的关闭或者重定向以前进程默认打开的文件int fd open(DEV, O_RDWR);if(fd 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}else{close(0);close(1);close(2);}// 4. 可选进程执行路径发生更改if(currPath) chdir(currPath); }测试 #includetcpserver.hpp #includememory #includestdlib.h #includedaemon.hpp #includelog.hpp static void Usage(string proc) {cout \nUsage:\n\t proc serverport\n\n; } int main(int args,char* argv[]) {int sock3;if(args!2){Usage(argv[0]);exit(1);}uint16_t portatoi(argv[1]);unique_ptrtcpserver tcil(new tcpserver(port));tcil-inittcpserver();daemonSelf();tcil-start();return 0; }在服务端运行之前我们先调用daemon函数使其变成守护进程然后运行服务端 可以看到运行之后bash依然存在然后我们再运行客户端 是可以直接运行的并且我们关掉服务端再输入消息时也不会有任何的影响 那么这就是守护进程的概念和模拟实现希望大家能够理解。
http://wiki.neutronadmin.com/news/262892/

相关文章:

  • 网站空间 默认文档云梦县网站开发
  • 网站推广必备的工具自己 做网站
  • 网站建设 栏目管理网站主机建设方案
  • 如何自己免费建网站把自己的网站卖给别人后对方做违法
  • 青海制作网站有哪些比较好的企业网站建设
  • 设计个网站要多少钱一个网站如何工作流程
  • 物流网站给做软件全国建设网站图片
  • 北京网站建设公司艺唯思企业微信下载官方网站
  • 网站开发到上线的过程软件源码成品资源下载网站
  • 品牌网站建设哪好网站如何做诺顿认证
  • flarum wordpress湖南网站优化
  • 稷山做网站国内产品设计网站
  • 区域推广网站wordpress删除谷歌字体
  • 做网站的具体需求企业网站建设周期
  • 大岭山东莞网站建设2021国外免费服务器
  • 湘潭网站建设 安全还踏实磐石网络专业网站制作公司排行
  • 宁夏网站建设哪家好wordpress开发高级教程
  • 信誉好的企业网站开发中国建筑网上测评
  • 怎样成立一个网站2020十大网络热词
  • 有没有傻瓜式建设网站东台网站网站建设
  • 宣讲家网站美丽乡村建设厦门seo网络推广
  • wordpress建站详细教程视频爱站网自媒体数据
  • 长安网站建设公司哪家好惠州市seo上词贵不贵
  • 温州做网站报价新昌建设局网站
  • 网站域名注册如何填写顶针 东莞网站建设
  • 网站设计模板psd陕西建设厅八大员官方网站
  • 江西威乐建设集团有限公司企业网站微信的企业网站模板
  • 九江浔阳网站建设婚恋网站设计
  • 南阳做网站多少费用wordpress 双语网站
  • 公司网站与营销网站在栏目上的不同wordpress主题页