【网络编程】Linux服务器程序规范相关内容

文章目录

  • 1、日志
    • 1.1、syslog()函数
  • 2、用户信息
    • 2.1、UID、EUID、GID、EGID
  • 3、进程间关系
    • 3.1、进程组
    • 3.2、会话
  • 4、服务器程序后台化(守护进程)


1、日志

  Linux提供一个守护进程rsyslogd来处理系统日志,系统日志中包括用户进程产生的日志以及内核日志。

  • 用户进程调用syslog生成系统日志,并将内容输出到socket类型的文件/dev/log
  • 内核日志是由priontk打印到内核的环状缓存中并直接映射到/proc/kmsg

  rsyslogd从以上两个文件中接收到输入的日志后,会把它们输出到指定的日志文件,rsyslogd的主配置文件为/etc/rsyslog.conf,通过修改主配置文件可以修改不同信息的存放路径,部分默认情况下:

  • 调试信息保存到/var/log/debug
  • 普通信息保存到/var/log/message
  • 内核消息保存到/var/log/kern.log

  两种日志信息的传递过程如下所示
在这里插入图片描述

1.1、syslog()函数

#include <syslog.h>
void syslog(int priority, const char* message, ...);

  priority是设施值与日志级别的按位与,设施值的默认值是LOG_USER,日志级别有以下几个

#include <syslog.h>
#define LOG_EMERG     0  //系统不可用
#define LOG_ALERT     1  //报警,需要立即采取行动
#define LOG_CRIT      2  //非常严重的情况
#define LOG_ERR       3  //错误
#define LOG_WARNING   4  //警告
#define LOG_NOTICE    5  //通知
#define LOG_INFO      6  //信息
#define LOG_DEBUG     7  //调试

  下面函数设置日志掩码,使得日志级别大于日志掩码的日志被忽略,从而使得调试信息在发布之后自动删除。

int setlogmask(int maskpri);

  使用下面函数可以关闭日志功能

void closelog();

2、用户信息

2.1、UID、EUID、GID、EGID

  在Linux当中一个进程(程序)拥有四个ID:真实用户UID、有效用户EUID、真实组GID和有效组EGID。针对UID以及EUID来看:

  • UID:指的是登录该进程的用户UID
  • EUID:指的是当前用户执行操作时,该用户有没有权限去执行该操作,要看此时的有效用户是否有权限去执行操作

  相关函数如下:

#include <sys/types.h>
#include <unistd.h>
uid_t getuid();
uid_t geteuid();
gid_t getgid();
gid_t getegid();
int setuid();
int seteuid();
int setgid();
int setegid();

3、进程间关系

3.1、进程组

  每个进程组都有一个首领进程,其PGIDPID相同,进程组会一直存在,直到其中的所有进程都退出或者加入到其他进程组。

#include <unistd.h>
pid_t getpgid(pid_t pid);
//成功返回进程pid所在的进程组pgid,失败返回-1并设置error
int setpgid(pid_t pid, pid_t pgid);

  一个进程只能设置自己或其子进程的PGID,上面的函数是将PID为变量pid的进程的PGID设置为变量pgid,这时有以下几种情况:

  • 当pid==pgid时,则由pid的进程作为其进程组的首领进程。
  • 当pid==0时,表示设置当前的PGID为变量pgid。
  • 当pgid==0时,则使用变量pid作为目标PGID

3.2、会话

  一些有关联的进程组会形成一个会话。

#incclude <unistd.h>
//创建会话
pid_t setsid(void);
//函数成功返回新进程组的PGID,失败返回-1并设置error

  该函数由进程组的首领调用会产生一个错误,而由非首领的进程调用,该进程在创建一个新会话的同时,会有以下效果:

  • 调用进程成为会话的首领,此时该进程是新会话的唯一成员
  • 新建一个进程组,其PGID就是进程的PID,调用进程成为该组的首领
  • 调用进程将甩开终端(如果存在终端的话)

  在linux中并没有会话ID的概念,认为会话ID等于进程组的PGID,并且有以下函数读取会话ID(SID):

#include <unistd.h>
pid_t getsid(pid_t pid);

4、服务器程序后台化(守护进程)

#include <unistd.h>
int daemon(int nochdir, int noclose);

daemon的作用是可以将当前进程转化为后台进程
如果nochdir为零,daemon()将进程的当前工作目录更改为根目录/; 否则,当前工作目录保持不变。
如果noclose为零,daemon()将标准输入,标准输出和标准错误重定向到/dev/null; 否则,不会对这些文件描述符进行更改。(参数为0时有效)
返回值:
deamon()调用了fork(),如果fork成功,那么父进程就调用_exit()退出,因此只能通过子进程看到进一步的错误。如果成功函数返回0,否则返回-1并设置errno。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20973.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

less预处理语言的运用之-变量拼接那点事

less语法的技巧总结&#xff0c;很基础&#xff0c;熟练掌握后能提高我们在大型项目中的开发效率 a:0.5; showdaw-px:100; mkcolor1:#6ec5ff; num:1; .outer{//拼接的字符串在变量后面&#xff0c;需要在冒号后面加~width:~"{showdaw-px}px";//拼接的字符串在冒号后…

Intellij IDEA突然无法启动问题

遇到的情况&#xff1a;Intellij IDEA 双击或者鼠标右键右键单击都无法启动&#xff0c;打开任务管理器也没有Intellij IDEA线程启动。 解决方法&#xff1a; 第一步&#xff1a;以管理员身份打开命令提示符&#xff0c;输入命令(“ netsh winsock reset ”)&#xff0c;关闭…

selenium查找svg元素

目录 如何为SVG元素编写XPath 使用local-name&#xff08;&#xff09;的语法 需要记住的一点 将“and”与SVG元素一起使用 如何定位嵌套的SVG元素&#xff1f; XPath是一种用于定位XML文档中的web元素的语言&#xff0c;包括构成网页的HTML文档。在Selenium中&#xff0…

用VScode运行vue框架时,报无法运行的错误

报错内容 问题出在了版本上面&#xff0c;从reason可以了解到是由于不支持的原因 然后上面报错的几乎都属于node_modules包内的&#xff0c;因此我们可以判断&#xff0c;是node.js版本的问题导致的&#xff08;尤其是你从网上拷贝比较旧的项目的时候&#xff0c;可能需要对依赖…

在VMware Workstation安装 ESXI8.0初体验

文章目录 &#x1f41f;前言&#x1f41f;安装&#x1f41f;在VMware WorkStation中创建虚拟机&#x1f41f;ESXI部署安装&#x1f41f;安装完成后配置 &#x1f41f;前言 ESXI8.0版本开始最低RAM从以前的4GB变为8GB 本文所使用到的镜像以及Key都可以到我的网站中下载 地址&…

PreparedStatement 相比于 Statement的优点

PreparedStatement 相比于 Statement&#xff0c;有以下几个优点&#xff1a; 1. 预编译&#xff1a;PreparedStatement 对象在执行 SQL 语句之前会进行预编译&#xff0c;这意味着数据库管理系统可以提前解析和编译 SQL 语句&#xff0c;以优化执行计划&#xff0c;从而提高查…

多条件见多值查询的 Excel 公式和 python 函数

问题 Python草堂 群的一位群友问&#xff1a;excel 数据表&#xff0c;用 vlookup 函数怎样实现多条件查询多值&#xff0c;多值排到一行上。如下图所示&#xff1a; 左边是数据清单&#xff0c;希望根据两个条件&#xff1a;产品、日期&#xff0c;查询数量&#xff0c;列到…

【C++】priority_queue使用与模拟实现

认识priority_queue 1、priority_queue(优先级队列)是一种容器适配器&#xff0c;底层是一个完全二叉树的大堆&#xff08;堆总是一颗完全二叉树&#xff0c;根结点最大的堆叫做大堆&#xff1b;根结点最小的堆叫做小堆&#xff09;&#xff0c;头文件在queue中&#xff0c;根…

dSYM文件是什么 ?

Overview 概述 dSYM的全称是debug symbol, 所以dSYM文件就是debug symbol (dSYM) file, dSYM文件中的每个 debug symbol, 对应了一个关系, 这个关系一端是源代码里真实的符号(类名称、全局变量以及方法和函数名称), 另一端则是其定义的文件号和行号. Apple Documentation 苹果…

Java设计模式之结构型-享元模式(UML类图+案例分析)

目录 一、基本概念 二、UML类图 三、角色设计 四、案例分析 1、基本实现 2、游戏角色 五、总结 一、基本概念 享元模式是一种结构型设计模式&#xff0c;主要用于减少创建大量相似对象所占用的内存&#xff0c;它通过共享技术来有效支持大量细粒度的对象。 二、UML类图…

即视角|出海资本热土——印尼市场洞察(上)

即视角Insight 共享即构新洞察&#xff0c;共建行业新动能——ZEGO即构科技基于音视频技术领域的多年深耕&#xff0c;综合面向各行业的服务经验&#xff0c;在【即视角】栏目发布即构对行业的洞察。 此前我们根据即构对出海客户的服务经验&#xff0c;输出了文章《即视角&am…

【数据结构】二叉树的前中后序遍历(C语言)

文章目录 什么是二叉树树相关的概念树的表示形式特殊的二叉树如何创造出一棵二叉树二叉树的遍历先序遍历(前序遍历)中序遍历后序遍历 总结 什么是二叉树 [二叉树] 顾名思义就是有两个分支节点的树&#xff0c;不仅如此&#xff0c;除了叶子外的所有节点都具有两个分支节点&…