Linux高性能服务器编程——ch7笔记

第7章 Linux服务器程序规范

7.1 日志

Linux提供rsyslogd守护进程接收用户进程输出的日志和内核日志。
image.png
应用程序使用syslog函数与rsyslogd守护进程通信。

void syslog(int priority, const char* message, …);

openlog函数:改变syslog的默认输出方式。
setlogmask函数:设置syslog的日志掩码(日志过滤,使日志级别大于日志掩码的日志信息被系统忽略)。
closelog函数:关闭日志功能。

7.2 用户信息

真实用户ID(UID)、有效用户ID(EUID)、真实组ID(GID)、有效组ID(EGID)。
一个进程拥有两个用户ID:UID和EUID。EUID存在的目的是方便资源访问:它使得运行程序的用户拥有该程序的有效用户的权限。
有效用户为root的进程称为特权进程。EGID的含义与EUID类似:给运行目标程序的组用户提供有效组的权限。

#include <unistd.h>
#include <stdio.h>int main(int argc, char *argv[])
{uid_t uid = getuid();uid_t euid = geteuid();printf("userid is %d, effective userid is:%d \n", uid, euid);return 0;
}

进程的UID是启动程序的用户的ID,而EUID则是root账户(文件所有者)的ID。

static bool switch_to_user( uid_t user_id, gid_t gp_id )
{//先确保目标用户不是rootif ( ( user_id == 0 ) && ( gp_id == 0 ) ){return false;}//确保当前用户是合法用户:root或者目标用户gid_t gid = getgid();uid_t uid = getuid();if ( ( ( gid != 0 ) || ( uid != 0 ) ) && ( ( gid != gp_id ) || ( uid != user_id ) ) ){return false;}//如果不是root,则已经是目标用户if ( uid != 0 ){return true;}//切换到目标用户if ( ( setgid( gp_id ) < 0 ) || ( setuid( user_id ) < 0 ) ){return false;}return true;
}

7.3 进程间关系

每个进程都隶属于一个进程组,因此它们除了PID信息外,还有进程组ID(PGID)。
每个进程组都有一个首领进程,其PGID和PID相同。进程组将一直存在,直到其中所有进程都退出,或者加入到其他进程组。
一个进程只能设置自己或者其子进程的PGID,并且,当子进程调用exec系列函数后,也不能再在父进程中对它设置PGID。
一些有关联的进程组将形成一个会话(session),通过setsid函数实现。调用进程成为会话的首领,新建一个进程组,其PGID就是调用进程的PID,调用进程成为该组的首领。调用进程将甩开终端。
image.png

7.4 系统资源限制

物理设备限制(CPU 数量、内存数量等)、系统策略限制(CPU 时间等),以及具体实现的限制(比如文件名的最大长度)。
getrlimit、setrlimit函数:读取和设置系统资源限制。

7.5 改变工作目录和根目录

getcwd函数:获取进程当前工作目录。
chdir函数:改变进程工作目录。
chroot函数:改变进程根目录。并不改变进程的当前工作目录,仍需要用chdir函数将工作目录切换至新的根目录。

7.6 服务器程序后台化

bool daemonize()
{//创建子进程,关闭父进程,这样可以使程序在后台运行pid_t pid = fork();if (pid < 0)return false;else if (pid > 0)exit(0);//设置文件权限掩码。当进程创建新文件(使用open(const char *pathname, int flags,// mode_t mode)系统调用)时,文件的权限将是 mode & 0777umask(0);//创建新的会话,设置本进程为进程组的首领pid_t sid = setsid();if (sid < 0)return false;//切换工作目录if ((chdir("/")) < 0)return false;//关闭标准输入设备、标准输出设备和标准错误输出设备close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);//关闭其他已经打开的文件描述符,代码省略//将标准输入、标准输出和标准错误输出都定向到 /dev/null 文件open("/dev/null", O_RDONLY);open("/dev/null", O_RDWR);open("/dev/null", O_RDWR);return true;
}

int daemon(int nochdir, int noclose);

nochdir是否改变工作目录,noclose是否将标准输入、标准输出和标准错误输出都定向到 /dev/null 文件。

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

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

相关文章

SD NAND对比TF卡优势(以CSNP4GCR01-AMW为例)

最近做的一个项目&#xff0c; 需要加大容量存储&#xff0c;这让我想到之前在做ARM的开发板使用的TF卡方案&#xff0c;但是TF卡需要携带卡槽的&#xff0c;但是有限的PCB板布局已经放不下卡槽的位置。 这个时候就需要那种能够不用卡槽&#xff0c;直接贴在板子上面&#xff0…

手把手教你使用Express框架在Node服务端实现图片渲染

手把手教你使用Express框架在Node服务端实现图片渲染 1.前言2.node-canvas库3.搭建node服务端环境3.1 初始化项目3.2 使用内置http模块创建服务3.3 使用Express创建服务 4.服务端渲染图片4.1 创建Express路由4.2 绘制三角形4.3 静态资源中间件4.4 写入图片文件4.5 渲染Echarts图…

使用 Data Assistant 快速创建测试数据集

使用 Data Assistant 快速创建测试数据集 Data Assistant 提供超过 100 种数据类型&#xff0c;为任何开发、测试或演示目的生成大量、异构、真实的数据。 官网地址&#xff1a; http://www.redisant.cn/da 主要功能 Windows 原生 Data Assistant 使用 Windows Native 技术…

SpringBoot集成Redisson操作Redis

目录 一、前言二、基础集成配置&#xff08;redis单节点&#xff09;2.1、POM2.2、添加配置文件2.3、添加启动类2.4、添加测试类测试redisson操作redis 一、前言 Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格&#xff0c;Redisson相比较与Jedis和Lettuce来说最…

表结构的操作【MySQL】

文章目录 创建表例子 查看表结构修改表新增列属性修改列属性修改列名修改表名删除列 删除表 阅读前导&#xff1a; 一般来说&#xff0c;对表的操作可以分为对表结构和对表内容的操作。 对表结构的操作&#xff0c;就是用数据定义语言 DDL 来创建、修改或删除表中的对象&#…

数字秒表设计仿真VHDL跑表,源码,视频

名称&#xff1a;简单秒表设计仿真VHDL跑表 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表功能描述 本次练习只需要一个数码管(假设该数码管已被选中),实现数码管显示功能,具体要求如下(设数码管为共阳&#xff09; 1)实现秒表计时功能。…

在Word中,图片显示不全

在今天交作业的时候&#xff0c;发现了一个非常SB的事情&#xff0c;把图片复制过去显示不完全&#xff1a; 使用文心一言查看搜索了一下&#xff0c;发现可能是以下几种原因&#xff1a; 图片所在行的行高设置不正确。可以重新设置行高&#xff0c;具体步骤包括打开图片显示…

C++迭代器失效

在STL中&#xff0c;有些操作会导致迭代器失效&#xff0c;即之前获取的迭代器无法再安全地使用。这是因为这些操作可能会改变容器的结构&#xff0c;例如插入、删除元素等。 具体来说&#xff0c;以下情况下迭代器会失效&#xff1a; 1. 当插入或删除元素导致容器中的内存重新…

[ Windows-Nginx ]Windows服务器,Tomcat容器部署项目,整合Nginx

一、官网下载Nginx http://nginx.org/en/download.html 稳定版&#xff1a;windows的stable版本 注意&#xff1a;Nginx安装包不要放在中文目录下 二、conf目录下&#xff0c;修改nginx.conf文件 修改Nginx服务端口&#xff1a; 默认端口为80&#xff0c;即外界访问的入口…

localforage-本地存储的优化方案

前言 前端本地化存储算是一个老生常谈的话题了&#xff0c;我们对于 cookies、Web Storage&#xff08;sessionStorage、localStorage&#xff09;的使用已经非常熟悉&#xff0c;在面试与实际操作之中也会经常遇到相关的问题&#xff0c;但这些本地化存储的方式还存在一些缺陷…

【Java 进阶篇】深入了解 Bootstrap 插件

Bootstrap 是一个流行的前端框架&#xff0c;提供了各种强大的插件&#xff0c;用于增强网页和应用程序的功能和交互性。本篇博客将深入介绍 Bootstrap 插件&#xff0c;适用于那些刚刚开始学习前端开发的小白。 什么是 Bootstrap&#xff1f; 在深入探讨 Bootstrap 插件之前…

【Java 进阶篇】深入浅出:Bootstrap 轮播图

在现代网页设计中&#xff0c;轮播图是一个常见的元素。它们可以用于展示图片、广告、新闻、产品或任何您希望吸引用户注意力的内容。要实现一个轮播图&#xff0c;您通常需要一些复杂的HTML、CSS和JavaScript代码&#xff0c;这对于初学者来说可能会感到困难。但幸运的是&…