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

网站测评必须做电脑培训班有哪些科目

网站测评必须做,电脑培训班有哪些科目,设计师网上接私单app,网页打不开什么原因目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前,我们学习过socket编程中的udp通信与tcp通信,但是当时我们服务器启动的时候,都是以前台进程的方式启动的,这样很不优雅&#xff0c…

目录

前言

一、进程组ID与会话ID

二、setsid()  创建新会话

三、daemon 守护进程


前言

在之前,我们学习过socket编程中的udp通信与tcp通信,但是当时我们服务器启动的时候,都是以前台进程的方式启动的,这样很不优雅,因为前台进程无法接受命令输入,同时也可能一不小心被使用者终止。因此我们得让服务器以守护进程的方式进行运行。如果不太了解,可以看这篇文章前台进程与后台进程。

一、进程组ID与会话ID

我们输入 指令 ps axj 可以找到当前系统中的所有进程,并且查看如下各种信息。

  • PPID: 父进程ID。
  • PID: 进程ID。
  • PGID: 进程组ID。
  • SID: 会话ID。
  • TTY: 与进程关联的终端类型(如果有的话)。
  • TPGID: 终端的前台进程组ID(如果有的话)。
  • STAT: 进程状态(例如,S表示休眠,R表示运行等)。
  • UID: 用户ID,表示运行该进程的用户。
  • TIME: CPU时间,表示进程使用的CPU时间总量。
  • COMMAND: 启动进程的命令名或命令行。

我们主要来看进程组ID PGID 和会话ID SID。

如下,启动一个sleep进程,查询sleep进程的信息。发现sleep进程的组 PGID 就是自己的PID,PPID 就是bash进程的ID。也就是说该sleep自成进程组。 同时进程组默认是在一个会话中的。

如果我们又打开一个bash,一个命令创建三个sleep,会发现他们的PGID都是第一个创建的进程PID,同时SID都是bash。

他们的关系如下图所示。任何时刻,一个会话可以有很多进程组,bash是一个组,sleep1000 | sleep 2000 | sleep 3000 又是一个进程组,sleep 10000也是一个进程组。但默认情况只允许一个进程组在前台。

也就是说bash在前台的话, 命令行就能接受命令,如果前台被其他进程占据,那么bash就会退回到后台,也就无法接受命令了

因此,如果我们启动的服务器程序,是在当前会话中,那么当bash退出(shell关闭),或者被不小心kill 掉,那么我们的服务器也会随之崩溃。

如果想让服务器不受xshell用户登录和退出的影响,就要让服务器程序自成一个会话,不隶属于任何一个bash。这就是守护进程

二、setsid()  创建新会话

setsid() 可以创建一个新会话,调用之后,当前进程会与原会话和进程组脱离关系。这意味着进程不再属于原来的会话和进程组,而是成为新会话的领头进程,并可能创建一个新的进程组。

但是他有一个前提,调用setsid的进程不能是进程组的组长

也就是说之前的sleep 1000 | sleep 2000 | sleep 30000 中,sleep 1000进程是进程组的组长,那么他就无法使用setsid。

同时,如果当前进程组只有一个进程,那就默认该进程就是组长,也无法使用setsid。

那么我们处理方式也很简单,让进程fork一下,使用子进程去setsid即可。也就是说守护进程一定就是孤儿进程

三、daemon 守护进程

对于具体的进程守护化,我们通常需要做如下内容

  1. 忽略可能一起进程异常退出的信号
  2. fork进程,让子进程去调用setsid()
  3. 改变cwd(当前工作目录),可选可不选,如果让cwd变为根目录,想误删也就不太可能,同时访问速度也会更快一点。
  4. 处理用户的标准输入、标准输出、标准错误。守护进程化后,通常不需要直接与用户进行交互,避免资源浪费和潜在的问题。
#pragma once#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>//该文件相当于垃圾箱,往里面cout、cerr就相当于丢弃数据,cin相当于直接读到文件末尾
const char *dev_null = "/dev/null";void deamon(bool ischidr, bool isclose)
{// 1.忽略可能引起进程异常退出的信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2.fork进程,让子进程去setsidif (fork() > 0)exit(0);setsid();// 3.改变当前工作目录if (ischidr)chdir("/");// 4.处理用户的输入输出与错误int fd = open(dev_null, O_RDWR);if (isclose){//直接关闭close(0);close(1);close(2);}else{if (fd > 0){dup2(fd, 1);dup2(fd, 2);dup2(fd, 3);close(fd);}}
}

 库里面也有daemon函数,我们也是模仿库里面写的,但是自己写的daemon可控性会更高一些。

那么现在就可以对服务器(之前写的Tcp服务器)进程处理,直接调用deamon,同时日志的作用也体现出来了,将需要的消息放到日志中。

这样也能正常运行,并将进程守护化了,关闭shell也无法将线程退出,需要关闭机器或者使用kill命令。

 代码链接

http://www.tj-hxxt.cn/news/9503.html

相关文章:

  • 用asp.net做的购物网站做网站比较好的公司有哪些
  • 网站开发流程宜春郑州网站优化培训
  • 做产品网站多少钱谷歌搜索引擎下载安装
  • 混合式教学财务管理网站建设云南省最新疫情情况
  • 豆瓣wordpress优化大师在哪里
  • 兰州网站制作公司盐酸达泊西汀片是治疗什么的药物
  • 爱做网站视频2024政治时政热点
  • 青岛建设系统一体化网站软文营销案例200字
  • 做一个官方网站多少钱一个app开发
  • 如何通过网站做网上报名系统百度号码认证平台官网首页
  • 建设企业网站可行性分析网络推广外包
  • 国内做服装趋势的网站自己建立网站步骤
  • 网站建设需求范文怎么找专业的营销团队
  • wordpress 菜单设置seo人员培训
  • 哪些大网站是java做的百度手机版下载
  • 网站内页设计google图片搜索
  • 汽车网站方案淘宝店铺怎么运营
  • 网站目录遍历创量广告投放平台
  • 六安哪家做网站不错域名申请
  • 网站建设挣钱吗?seo和sem的区别
  • 沈阳网站建设小工作室dw网页制作教程
  • 网站制作模板北京电商网站seo
  • 前几年做那个网站致富网站建设推广服务
  • 烟台百度网站推广深圳最好的外贸seo培训
  • wordpress拖拽主题旺道seo软件技术
  • 网站服务器放置地百度推广账号登录入口
  • 淘客网站做百度推广英雄联盟韩国
  • 浦东做网站的公司台州网络推广
  • 江北网站建设价格网上找客户有什么渠道
  • 网站怎么自己编辑模块搜索大全引擎入口网站