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

企业网站的概念wordpress ajax 流量统计

企业网站的概念,wordpress ajax 流量统计,wordpress绿竹主题,创意设计生活用品文章目录 前言一. 日志介绍二. 简单日志1. 左字符串2. 右字符串 三. 守护进程1. ps -axj命令2. 会话扩展命令 3. 创建守护进程 结束语 前言 本系列文章是计算机网络学习的笔记#xff0c;欢迎大佬们阅读#xff0c;纠错#xff0c;分享相关知识。希望可以与你共同进步。 本… 文章目录 前言一. 日志介绍二. 简单日志1. 左字符串2. 右字符串 三. 守护进程1. ps -axj命令2. 会话扩展命令 3. 创建守护进程 结束语 前言 本系列文章是计算机网络学习的笔记欢迎大佬们阅读纠错分享相关知识。希望可以与你共同进步。 本篇博客介绍简单较为基础的日志。 日志和守护进程都是辅助服务器的一个是服务器的运行信息一个是服务器的运行方式 一. 日志介绍 日志是记录事件运行结果的工具 日志文件是重要的系统文件其中记录了很多重要的系统运行的事件。包括用户的登录信息系统的启动信息系统的安全信息各种服务相关信息 日志对于安全来说也很重要它记录了每天系统发生的各种事情通过日志来检查错误发送的原因或受到攻击时攻击者留下的痕迹 日志管理服务 日志级别分为 debug有调试信息的日志通信最多info一般信息日志最常用notic最具有重要性的普通条件的信息warning警告级别err错误级别组织某个功能或者模块不能正常工作的信息crit严重级别阻止整个系统或者整个软件不能正常工作的信息alert需要立刻修改的信息emerg内核崩溃等重要信息fatal致命错误none什么都不记录 注意 从上到下级别从低到高记录信息越来越少 二. 简单日志 本篇博客的日志是以函数的形式完成的调用方式如下 logMessage(Warning,read error,%d,errno:%d,strerror(errno),errno);参数有三个日志级别格式控制可变参数 对应如下 void logMessage(int level,const char*format,...){}注意format类型需要时const char*因为大部分是以常量字符串的形式传参 我们期望最后的日志信息是这样的[日志级别] [时间] [进程号] 消息内容format 可以将日志信息分成两部分左字符串和右字符串前三个为一组消息内容使用vsnprintf 1. 左字符串 #pragma once#includeiostream #includestring #includectime #includeunistd.h #includesys/types.h #includestdarg.henum {Debug 0,Info,Warning,Error,Fatal,Uknown }; //获取日志等级字符串 static std::string getLevelString(int level) {switch (level){case Debug:return Debug;case Info:return Info;case Warning:return Warning;case Error:return Error;case Fatal:return Fatal;default:return Uknown;} } //获取时间字符串 static std::string gettime() {time_t curtime(nullptr);struct tm* tmplocaltime(cur);char buffer[128];snprintf(buffer,sizeof(buffer),%d-%d-%d %d:%d:%d,tmp-tm_year1,tmp-tm_mon1,tmp-tm_mday1,tmp-tm_hour,tmp-tm_min,tmp-tm_sec);return buffer; } //日志信息 void logMessage(int level,char*format,...) {char logLeft[1024];std::string level_stringgetLevelString(level);//日志级别std::string time_stringgettime();//时间std::string pid_stringstd::to_string(getpid());//进程号//[日志级别] [时间] [进程号]snprintf(logLeft,sizeof(logLeft),[%s] [%s] [%s] ,level_string.c_str(),time_string.c_str(),pid_string.c_str()); }2. 右字符串 接下来介绍va系列——解析可变参数 在C语言学习中函数的调用会创建栈帧而函数传参会进行压栈可变参数也是如此所以可变参数的前一个参数的后一位就是可变参数的起始地址 va_list类似指针可以指向可变参数的起始和结束可以遍历可变参数va_start将va_list定位到last后面va_arg将从va_list开始的数据按照type类型进行提取返回va_end清空va_listva_copy将src拷贝给dest 而vsnprintf可以帮我们遍历可变参数不需要我们自己控制 vsnprintf() vsnprintf是一个标准的 C 函数用于格式化字符串并将生成的字符存储在缓冲区中。它与函数类似但有一个关键区别函数不是直接采用可变长度的参数列表而是采用参数该参数是已使用宏初始化的参数列表。 以下是该函数的工作原理 str写入的缓冲区size缓冲区大小format格式控制apva_list 指向可变参数的指针 使用如下 const std::string filename./log/tcpserver.log;void logMessage(int level,char*format,...) {char logLeft[1024];std::string level_stringgetLevelString(level);std::string time_stringgettime();std::string pid_stringstd::to_string(getpid());snprintf(logLeft,sizeof(logLeft),[%s] [%s] [%s] ,level_string.c_str(),time_string.c_str(),pid_string.c_str());char logRight[1024];va_list p;//类似指针va_start(p,format);//将p定位到可变参数首地址vsnprintf(logRight,sizeof(logRight),format,p);//按format格式将可变参数写入logRightva_end(p);//将va_list清理汇总两个字符串打印//printf(%s%s\n,logLeft,logRight);//也可以输入到日志文件中进行持久化FILE *fp fopen(filename.c_str(), a);if(fp nullptr)return;fprintf(fp,%s%s\n, logLeft, logRight);fflush(fp); //可写也可以不写fclose(fp); }完整代码如下 log.hpp #pragma once#includeiostream #includestring #includectime #includeunistd.h #includesys/types.h #includestdarg.hconst std::string filename ./log/tcpserver.log;enum {Debug 0,Info,Warning,Error,Fatal,Uknown };static std::string getLevelString(int level) {switch (level){case Debug:return Debug;case Info:return Info;case Warning:return Warning;case Error:return Error;case Fatal:return Fatal;default:return Uknown;} }static std::string gettime() {time_t curtime(nullptr);struct tm* tmplocaltime(cur);char buffer[128];snprintf(buffer,sizeof(buffer),%d-%d-%d %d:%d:%d,tmp-tm_year1,tmp-tm_mon1,tmp-tm_mday1,tmp-tm_hour,tmp-tm_min,tmp-tm_sec);return buffer; }//日志组成日志等级 时间 PID 消息内容//日志等级 格式控制 可变参数 void logMessage(int level,char*format,...) {char logLeft[1024];std::string level_stringgetLevelString(level);std::string time_stringgettime();std::string pid_stringstd::to_string(getpid());snprintf(logLeft,sizeof(logLeft),[%s] [%s] [%s] ,level_string.c_str(),time_string.c_str(),pid_string.c_str());char logRight[1024];va_list p;//类似指针va_start(p,format);//将p定位到可变参数首地址vsnprintf(logRight,sizeof(logRight),format,p);//按format格式将可变参数写入logRightva_end(p);//将va_list清理打印日志信息//printf(%s%s\n,logLeft,logRight);// 保存到文件中FILE *fp fopen(filename.c_str(), a);if(fp nullptr)return;fprintf(fp,%s%s\n, logLeft, logRight);fflush(fp); //可写也可以不写fclose(fp); }三. 守护进程 服务器一方面需要24小时不间断运行另一方面还需要不被其他程序所影响更准确点是避免被其他程序的任何终端所产生信息所打断。这就要求服务器要守护进程化 守护进程 守护进程也就是通常说的 Daemon进程精灵进程是 Linux 中的后台服务进程。它是一个生存周期较长的进程通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件 守护进程本质是孤儿进程脱离终端。避免被任何终端所产生的信息所打断其在执行过程的信息也不在任何终端上显示一般是是使用日志文件持久化信息。 由于在Linux中每一个系统与用户进行交流的界面被称为终端每一个从此终端开始运行的进程都会依附于这个终端这个终端就称为这些进程的控制终端当控制终端被关闭时相应的进程就会自动关闭 Linux的终端文件路径一般在 /dev中 1. ps -axj命令 使用ps -axj命令查看进程 PPID父进程进程IDPID进程IDPGID进程组IDSID会话IDTTY控制终端?表示没有控制终端TPGID终端进程组IDSTAT状态 R进程正在运行或在运行队列中等待 S进程处于休眠状态等待某个条件的形成或接收到信号。S代表前台运行。s表示会话领导Ss表示既在休眠又是会话领导 D进程不可中断状态收到信号不唤醒和不可运行进程必须等待直到有中断发生通常是IO Z进程已终止但进程描述符存在直到父进程调用pidwait()回收后释放。僵尸进程 T进程已停止进程收到SIGSTOPSIGSTPSIGTINSIGTOU信号后停止运行 X已经死掉的进程 UID 执行者身份COMMAND程序名/运行该程序的指令 2. 会话 在ps -axj中可以看到有进程组ID和会话ID。二者分别是什么呢 可以看到一条命令的三个sleep形成了三个进程进程号依次递增 PGID进程组号相同和第一个进程ID相同SID会话ID相同终端文件相同TPGID终端进程组PGID 再起三个sleep任务 可以看到PGID不同SID相同 会话 进程组 进程会话关联一个终端文件进程组的组长都是多个进程中的第一个 扩展命令 接下来介绍一些命令 ctrlz将当前前台进程调到后台并停止 jobs查看当前会话的后台任务会话的概念稍后讲解 jobs只能查看本会话的后台任务无法查看其他会话的后台任务 fg任务号将后台程序调到前台运行 bg任务号让后台停止的任务开始运行 接下来回归会话的讲解 当我们通过Xshell连接云服务器时我们登录成功会为本次登录创建一个会话。每一次登录成功都会创建会话。每个会话会关联一个终端文件。当我们退出时其实只是将该会话资源回收 其中创建的进程组和内部进程都是在当前会话中。因为一个会话只有一个控制终端所以如果后台任务提到前台老的前台任务就无法运行 一个会话只能有一个前台任务在运行 而退出会销毁会话所以如果运行服务器的会话关闭那么服务器也会停止运行。 所以一般的网络服务器为了不受到用户的登录注销等其他影响网络服务器都需要以守护进程的方式进行 3. 创建守护进程 守护进程本质是自成会话的孤儿进程 而一个进程要想成为守护进程需要满足以下几个要求 不能是进程组组长。因为要调用函数独立出去如果进程组组长则会影响进程组的其他进程需要忽略异常信号读写错误输入输出需要特殊处理进程的工作路径可能要改 新建会话的函数setsid() 返回值成功返回新的进程ID失败返回-1并设置错误码 哪个进程调用这个函数哪个进程的的资源就会被转移到这个自成会话的进程 代码如下 daemon.hpp #pragma once #includecerrno #includecstdlib #includecstring #includesignal.h #includeunistd.h #includesys/types.h #includesys/stat.h #includefcntl.h#includelog.hppvoid Daemon() {//1.忽略异常信号signal(SIGPIPE,SIG_IGN);signal(SIGCHLD,SIG_IGN);//2.守护进程不能是进程组组长if(fork()0)exit(0);//父进程退出//子进程不会是进程组组长//3.新建会话自己成为会话的话首进程pid_t retsetsid();if((int)ret-1){logMessage(Fatal,deamon error,%s,errno:%d,strerror(errno),errno);exit(1);}//4.可选更改守护进程的工作路径//chdir(/);//5.处理后续的读写错误——文件描述符0,1,2int fdopen(/dev/null,O_RDWR);if(fd0){logMessage(Fatal,open null error,%s,errno:%d,strerror(errno),errno);exit(2);}//将0,1,2的内容输入到null文件dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd); }/dev/null是一个文件像是一个黑洞一样扔进去的数据不会显示也从里面读不到数据 正好可以将读写错误——0,12文件的输入输出数据丢进这个黑洞文件中。 但如此日志系统就不能以打印显示日志信息而需要创建一个日志文件将日志信息写入文件中进行持久化。如此也不会影响其他进程 结束语 本篇博客到此结束感谢看到此处。 欢迎大家纠错和补充 如果觉得本篇文章对你有所帮助的话不妨点个赞支持一下博主拜托啦这对我真的很重要。
http://www.pierceye.com/news/339764/

相关文章:

  • 网站公司做网站dede查看网站
  • 网站软件大全免费下品牌网站策划
  • 网站解析密码网站被收录后又被提出了
  • 图片外链上传网站美篇app怎么制作
  • h5自适应网站建设是什么意思保险官网
  • 建设网站的时候名师工作室建设网站
  • 网页开发网站宜昌网站seo
  • 网站做国际化网站服务器及运营维护公告
  • 潍坊网站开发招聘信息只做乡村旅游的网站
  • 什么网站可以做二建的题目汕尾网站网站建设
  • 如何用wampp 做网站网店seo
  • 新乡企业网站建设公司长安网站建设多少钱
  • 九亭镇村镇建设办官方网站工作简历模板电子版免费
  • 有保障的无锡网站制作wordpress怎么映射到外网访问不了
  • 邯郸网站设计怎么做移动网站 用户体验
  • 实验报告网站建设与网页制作oa系统是什么
  • 信息发布网站开发模板提高网站响应速度
  • 本科网站开发毕业设计贵阳平台网站建设
  • 安徽省建设厅网站打不开杭州建设网 执法人员名单
  • 外贸网站建站公司如何做滴滴网站平台
  • 淄博张店做网站的公司建筑设计公司资质等级
  • 一个网站的建设需要哪些流程图eclipse的开发网站开发
  • 网站链接跳转怎么做建立数据库连接时出错wordpress
  • 漳州网站建设选博大不错江苏省建设工程注册中心网站
  • 文件下载网站源码免费做网站空间
  • 怎样给公司做一个网站做推广新网域名管理平台
  • 新蔡县做网站收多少钱二级分销利润分配模式
  • 鞍山百度网站怎么制作python培训视频教程
  • 湛江网站建设与网页网站建设需要什么证件
  • 东莞建站公司案例全网天下案例wordpress入门教程知乎