5 系统数据文件和信息

news2025/1/10 2:58:39

5.1 口令文件

        口令文件包含了下表中所示的各字段,这些字段包含在<pwd.h>中定义的passwd结构中。

/etc/passwd文件中的字段
说 明struct passwd 成员
用户名char *pw_name
加密口令char *pw_passwd
数值用户IDuid_t pw_uid
数值组IDgid_t pw_gid
注释字段char *pw_gecos
初始工作目录char *pw_dir
初始shell(用户程序)char *pw_shell

        口令文件是/etc/passwd,而且是一个文本文件。每一行包含上表中所示的 7个字段,字段之间用冒号相分隔。例如,该文件中可能有下列三行:

root:jheVopR58x9Fx:0:1:The superuser:/:/bin/sh
nobody:*:65534:65534::/:
stevens:3hKVD8R58r9Fx:224:20:Richard Stevens:/home/stevens:/bin/ksh

关于这些登录项请注意下列各点:

  • 通常有一个登录项,其用户名为root,其用户ID是0 (超级用户)。
  • 加密口令字段包含了经单向密码算法处理过的用户口令副本。因为此算法是单向的,所 以不能从加密口令猜测到原来的口令。
  • 口令文件中的某些字段可能是空。如果密码口令字段为空,这通常就意味着该用户没有口令。nobody有两个空白字段:注释字段和初始shell字段。空白注释字段不产生任何影响。空白shell字段则表示取系统默认值,通常是/bin/sh。

        定义了两个存取口令文件中信息的函数。在给出用户登录名或数值用户ID后,这两个函数就能查看相关记录。

#include <sys/types.h>
#include <pwd.h>

//两个函数返回:若成功则为指针,若出错则为NULL
struct passwd *getpwuid(uid_t uid) ;
struct passwd *getpwnam(const char *name) ;

        如果要查看的只是一个登录名或用户ID,那么这两个函数能满足要求,但是也有些程序要查看整个口令文件。下列三个函数则可用于此。

#include <sys/types.h>
#include <pwd.h>

//返回:若成功则为指针,若出错或到达文件尾端则为NULL
struct passwd *getpwent(void);

void setpwent(void);
void endpwent(void);

5.2 组文件

        组文件包含了下表中所示字段。这些字段包含在<grp.h> 中所定义的group结构中。

/etc/group文件中的字段
说 明struct group 成员
组名char *gr_name
加密口令char *gr_passwd
数字组IDint gr_gid
指向各用户名指针的数组char **gr_mem

字段gr_mem是一个指针数组,其中的指针各指向一个属于该组的用户名。该数组以null结尾。

        可以用下列两个函数来查看组名或数值组ID。

#include <sys/types.h>
#include <grp.h>

//两个函数返回:若成功则为指针,若出错则为NULL
struct group *getgrgid(gid_t gid) ;
struct group *getgrnam(const char * name) ;

如同对口令文件进行操作的函数一样,这两个函数通常也返回指向一个静态变量的指针,在每次调用时都重写该静态变量。

        如果需要搜索整个组文件,则须使用另外几个函数。下列三个函数类似于针对口令文件的三个函数。

#include <sys/types.h>
#include <grp.h>

//返回:若成功则为指针,若出错或到达文件尾端则为NULL
struct group *getgrent(void);

void setgrent(void);
void endgrent(void);

        setgrent打开组文件(如若它尚末被打开)并反绕它。getgrent从组文件中读下一个记录,如若该文件尚未打开则先打开它。endgrent关闭组文件。

5.3 添加组ID

        为了存取和设置添加组I D提供了下列三个函数:

#include <sys/types.h>
#include <unistd.h>

//返回:若成功则为添加的组ID数,若出错则为-1
int getgroups(int gidsetsize, gid_t grouplist[]) ;

//两个函数返回:若成功则为 0,若出错则为-1
int setgroups(int ngroups, const gid_t grouplist[]) ;
int initgroups(const char *username, gid_t basegid) ;

5.4 其它数据文件

        UNIX系统还使用很多其他文件。例如, BSD网络软件有一个记录各网络服务器所提供的服务的数据文件 (/etc/services ),有一个记录协议信息的数据文件(/etc/protocols),还有一个则是记录网络信息的数据文件(/etc/networks)。幸运的是,对于这些数据文件的界面都与上述对口令文件和组文件的相似。

        一般情况下每个数据文件至少有三个函数:

(1)get函数:读下一个记录,如果需要还打开该文件。此种函数通常返回指向一个结构的指针。当已达到文件尾端时返回空指针。大多数 get函数返回指向一个静态存储类结构的指针,如果要保存其内容,则需复制它。

(2)set函数:打开相应数据文件 (如果尚末打开),然后反绕该文件。如果希望在相应文件起始处开始处理,则调用此函数。

(3) end函数:关闭相应数据文件。正如前述,在结束了对相应数据文件的读、写操作后, 总应调用此函数以关闭所有相关文件。

5.5 登录会计

        大多数UNIX系统都提供下列两个数据文件:utmp文件,它记录当前登录进系统的各个用 户;wtmp文件,它跟踪各个登录和注销事件。

        包含下列结构的一个二进制记录写入这两个文件中:

struct utmp {
char ut_line[8]; /* tty line: "ttyh0", "ttyd0", "ttyp0", ... */
char ut_name[8]; /* login name */
long ut_time;    /* seconds since Epoch */
} ;

5.6 系统标识

        定义了uname函数,它返回与主机和操作系统有关的信息。

#include <sys/utsname.h>

//返回:若成功则为非负值,若出错则为- 1
int uname(struct utsname *name) ;
struct utsname {
char sysname[9]; /* name of the operating system */
char nodename[9]; /* name of this node */
char release[9]; /* current release of operating system */
char version[9]; /* current version of this release */
char machine[9]; /* name of hardware type */
} ;

        伯克利类的版本提供gethostname函数,它只返回主机名,该名字通常就是TCP/IP网络上主 机的名字。

#include <unistd.h>

//返回:若成功则为0,若出错则为-1
int gethostname(char *name, int namelen) ;

通过name返回的字符串以null结尾 (除非没有提供足够的空间 )。<sys/param.h>中的常数 MAXHOSTNAMELEN规定了此名字的最大长度(通常是64字节)。如果宿主机联接到TCP/IP网络中,则此主机名通常是该主机的完整域名。

5.7 时间和日期例程

        由UNIX内核提供的基本时间服务是国际标准时间公元 1970年1月1日00 : 00 : 00以来经过的秒数。这种秒数是以数据类型 time_t表示的。我们称它们为日历时间。日历时间包括时间和日期。UNIX在这方面与其他操作系统的区别是:

( 1 )以国际标准时间而非本地时间计时;

( 2 )可自动进行转换,例如变换到夏日制;

( 3 )将时间和日期作为一个量值保存。time函数 返回当前时间和日期。

#include <time.h>

//返回:若成功则为时间值,若出错则为- 1
time_t time(time_t *calptr) ;

时间值作为函数值返回。如果参数非null,则时间值也存放在由calptr指向的单元内。

        一旦取得这种以秒计的很大的时间值后,通常要调用另一个时间函数将其变换为人们可读的时间和日期。下图中说明了各种时间函数之间的关系。(图中以虚线表示的四个函数localtime、mktime、ctime和strftime都受到环境变量T Z的影响。)

各个时间函数之间的关系

         两个函数localtime和gmtime将日历时间变换成以年、月、日、时、分、秒、周日表示的时 间,并将这些存放在一个tm结构中。

struct tm { /* a broken-down time */
    int tm_sec;   /* seconds after the minute: [0, 61] */
    int tm_min;   /* minutes after the hour: [0, 59] */
    int tm_hour;  /* hours after midnight: [0, 23] */
    int tm_mday;  /* day of the month: [1, 31] */
    int tm_mon;   /* month of the year: [0, 11] */
    int tm_year;  /* years since 1900 */
    int tm_wday;  /* days since Sunday: [0, 6] */
    int tm_yday;  /* days since January 1: [0, 365] */
    int tm_isdst; /* daylight saving time flag: <0, 0, >0 */
}
#include <time.h>

//两个函数返回:指向tm结构的指针
struct tm *gmtime(const time_t *calptr) ;
struct tm *localtime(const time_t *calptr) ;

localtime和gmtime之间的区别是: localtime将日历时间变换成本地时间 (考虑到本地时区和夏时 制标志),而gmtime则将日历时间变换成国际标准时间的年、月、日、时、分、秒、周日。

        函数mktime以本地时间的年、月、日等作为参数,将其变换成 time_t值。

#include <time.h>

//返回:若成功则为日历时间,若出错则为- 1
time_t mktime(struct tm *tmptr) ;

        asctime和ctime函数产生形式的26字节字符串,这与date(1)命令的系统默认输出形式类似:

Tue Jan 14 17:49:03 1992\n\0

#include <time.h>

//两个函数返回:指向null结尾的字符串
char *asctime(const struct tm *tmptr) ;
char *ctime(const time_t *calptr) ;

asctime的参数是指向年、月、日等字符串的指针,而 ctime的参数则是指向日历时间的指针。

        最后一个时间函数是strftime,它是非常复杂的printf类的时间值函数。

#include <time.h>

//返回:若有空间,则存入数组的字符数,否则为 0
size_t strftime(char *buf, size_t maxsize, const char * format, const struct tm *tmptr) ;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity实现GPU Cull渲染

前言 开放世界游戏中植被和物件的数量往往是巨大, 而传统组织大量植被渲染的方式是利用QuadTree/Octree/Kd-Tree等数据结构对植被Intance数据进行预先生成一个个Cluster&#xff0c;然后在运行时进行FrustumCull,收集可视的所有Cluster&#xff0c;最后进行DrawInstance. 这…

Yolov1 源码讲解 loss.py

结构 1.lt rb我觉得不是很合适 正确来说是lb rt 因为比较出来的都是左下和右上坐标 比如前两个&#xff0c;都是max出来的 选两个box左下坐标中最大的&#xff0c; 后两个则是右上坐标中最小的 那也就形成了交集面积 但是代码中仍然是lt rb我也就直接这样说 而算出lt和r…

zynq基于XDMA实现PCIE X8视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、基于zynq架构的PCIE4、总体设计思路和方案视频输入通路PCIE数据缓存通路视频输出通路 5、vivado工程详解6、SDK 工程详解7、驱动安装8、QT上位机软件9、上板调试验证10、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Expre…

二叉树的实现

二叉树 文章目录 二叉树背景二叉树的概念遍历方式代码实现 背景 数组存储方式的分析 优点&#xff1a;通过下标方式访问元素&#xff0c;速度快。对于有序数组&#xff0c;还可使用二分查找提高检索速度。 缺点&#xff1a;如果要检索具体某个值&#xff0c;或者插入值(按一…

linux中使用docker部署微服务

目录 一、制作jar包&#xff08;如果看一眼很简单&#xff0c;可以直接使用结尾的jar&#xff09; 1.首先创建一个微服务 demo2 2.启动微服务&#xff08;在DemoApplication上右键执行启动就行&#xff09; 注意&#xff1a;其他操作导致的 可能遇到的报错 3.修改端口 4.新…

ChatGPT的快速发展究竟给我们带来了什么?

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

java基础入门-05-【面向对象进阶(static继承)】

Java基础入门-05-【面向对象进阶&#xff08;static&继承&#xff09;】 13、面向对象进阶&#xff08;static&继承&#xff09;1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的…

Unity API详解——Random类

Random类是Unity中用于产生随机数的类&#xff0c;不可以实例化&#xff0c;只有静态属性和静态方法。本博客主要介绍了Random类的一些静态属性。 文章目录 一、Random类静态属性1、基本语法2、功能说明3、代码实现 二、rotationUniform属性1、基本语法2、功能说明1、规范化向量…

前沿探索,AI 在 API 开发测试中的应用

目录 一、引言二、AI 加持下的 API 设计1、NLP 在 API 设计中的应用2、DL 在 API 设计中的应用能力一&#xff1a;Apikit 如何利用 AI 生成最佳的 API 设计方案能力二&#xff1a; Apikit 如何利用 AI 提高 API 的可用性和易用性 三、AI 加持下的 API 开发能力三&#xff1a;Ap…

k8s二进制安装部署(详细)(3主2从)

目录 kubeadm 和二进制安装 k8s 适用场景分析 多 master 节点高可用架构图 集群环境准备 部署过程 修改主机内核参数&#xff08;所有节点&#xff09; 配置阿里云的repo源&#xff08;所有节点&#xff09; 配置国内安装 docker 和 containerd 的阿里云的 repo 源 配置…

比肩 ChatGPT,国内快速访问的强大 AI 工具 Claude

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

Gateway案例

官网:Spring Cloud Gateway 中文文档:Spring Cloud Gateway 2.1.0 中文官网文档 - 腾讯云开发者社区-腾讯云 一、网关介绍: 网关就是当前微服务的统一入口 通常在微服务项目中,只有网关项目是暴露在网络里的,其他服务一般都是在内网里, 用户访问网关,网关根据访问的路径,来进…

Tomcat安装步骤及详细配置教程(2022最新版)

网上的tomcat安装及配置教程一大堆&#xff0c;但是好多都过时了&#xff0c;根本不适用现在的版本&#xff0c;今天凯歌整理一篇Tomcat安装步骤及详细配置教程&#xff0c;2022年最新版~ Tomcat安装及配置教程主要分为四步&#xff1a; 步骤一&#xff1a;首先确认自己是否已…

ChatGPT登录操作扫盲级教程,附ChatGPT登录常见报错及处理技巧

文 / 韩彬&#xff08;微信公众号&#xff1a;量子论&#xff09; 有了帐号&#xff0c;我们自然可以使用ChatGPT尽情玩耍了。 知识扩展&#xff1a;ChatGPT是啥&#xff0c;以及注册的问题&#xff0c;可以看《ChatGPT常见问题手册&#xff0c;通俗易懂版&#xff0c;3分钟了解…

Windows微信聊天图片文件的解码和图片、视频占满电脑磁盘空间的清理

1 问题现象 我的Windows版微信最近老是提示“磁盘空间不足200MB&#xff0c;需及时清理磁盘”。 使用文件资源管理器查看我的电脑磁盘使用情况&#xff0c;发现C盘只剩下174MB空间可用。系统盘C盘空间耗尽已经严重影响电脑的使用。 2 问题分析 2.1 磁盘空间占用情况分析 由于…

【学习笔记】pandas提取excel数据形成三元组,采用neo4j数据库构建小型知识图谱

前言 代码来自github项目 neo4j-python-pandas-py2neo-v3&#xff0c;项目作者为Skyelbin。我记录一下运行该项目的一些过程文字以及遇到的问题和解决办法。 一、提取excel中的数据转换为DataFrame三元组格式 from dataToNeo4jClass.DataToNeo4jClass import DataToNeo4j imp…

实操带你使用Mybatis_plus(2)

文章目录 一、通用ServiceService CRUD 接口a> IServiceb>创建Service接口和实现类测试 二、常用注解1、TableName2、TableId雪花算法3、TableField4、TableLogic 一、通用Service Service CRUD 接口 通用 Service CRUD 封装IService 接口&#xff0c;进一步封装 CRUD …

选择无服务器:Babbel 的迁移故事

Babbel 是什么&#xff1f; Babbel 是一个完整的语言学习产品生态系统&#xff0c;囊括了世界上最畅销的语言学习应用程序。我们已售出超过 1000 万份订阅和超过 60,000 门涵盖 14 种语言的课程&#xff0c;创造了全球第一语言学习目的地。自 2007 年推出产品的第一天起&#…

vivid源码分析

vivid源码分析 文章目录 vivid源码分析如何编写V4L2驱动分析vivid.c的open,read,write,ioctl过程openreadioctlv4l2_ctrl_handler使用过程 如何编写V4L2驱动 分配/设置/注册v4l2_device.v4l2_device_register,v4l2_device(辅助作用&#xff0c;提供自旋锁&#xff0c;引用计数…

LeetCode单链表OJ题目做题思路分享

目录 移除链表元素链表的中间节点链表中倒数第K个节点合并两个有序链表 移除链表元素 链接: link 题目描述&#xff1a; 思路分享&#xff1a; 我们上个博客分享了第一种方法&#xff0c;下面我们分析第二种方法&#xff1a;思路就是将每一个不等于我们要删除的值的节点依次尾…