《unix环境高级编程》笔记4——系统数据文件和信息
文章目录
- 系统数据文件和信息
- 口令文件
- 获取口令文件 getwpuid getpwnam
- 阴影口令
- 组文件
- 附属组ID
- 查看附属组ID
- 其他文件
- 登录账户记录:
- 系统标识 uname gethostname
- 时间和日期
- 返回当前时间time
- 获取制定时钟时间clock_gettime
- 设定时间 clock_settime
- 时间转换:
- TZ影响的函数localtime mktime strftime
- TZ影响的函数localtime mktime strftime
系统数据文件和信息
口令文件
例如,/etc/passwd文件
root:x:0:0:root:/root:/bin/bash
root 通常ID都是0
加密口令占用一位。早期版本该字段存放口令,现在口令转移到别的文件。
如果口令字段为空,该用户无口令。
shell字段是可执行程序,指定用户登录的shell。如果为空使用系统默认
nobody是任何人都能登陆,但是不提供任何特权,这能访问人人都可读写的文件。
获取口令文件 getwpuid getpwnam
//pwd.h
struct passwd * getpwuid(uid_t uid);
struct passwd * getpwnam(const char *name);
//成功返回指针,失败放回NULLstruct passwd *getpwent(void); //搜索整个口令文件
//成功返回指针,出错或到文件尾返回NULL
void setpwent(void); //自我保护措施,确保在调用在文件头
void endpwent(void); //getpwnam和getpwuid完成后要调用endpwent关闭文件//搜索整个文件demo
struct passwd *p;
setpwent(); //确保定位开始处
while((p=getpwent())!=NULL){if(strcmp(name, ptr->pw_name) == 0) //name自己替换break; //找到对应的
}
endpwent(); // 关闭文件
eg:
#include <pwd.h>
int main(int argc, char *argv[]) {struct passwd * passwd;passwd=getpwnam(argv[1]);printf("name: %s \n", passwd->pw_name);printf("passwd: %s",passwd->pw_passwd);
}
阴影口令
加密口令是单向加密算法处理的用户口令副本。
阴影口令文件不是一般用户可以读取的。但是passwd可以用户自由读取
//shadow.h
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
//失败返回NULLvoid setspent(void);
void endspent(void); //关闭文件
组文件
头文件: grp.h
struct group :
//grp.h
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
//成功返回指针,失败返回NULL
如果搜索整个文件组:
//grp.h
struct group *getgrent(void);
//成功返回指针,出错或到文件尾端返回NULL
void setgrent(void);
void endgrent(void);
附属组ID
从前(大概是1983一起),一个用户只能属于一个组。后来引入了附属组ID(supplementary group ID),从此,用户不仅属于口令文件记录项中的ID组,还最多可以属于16个额外的组。所以文件访问检查权限时不仅与进程的有效组ID比较,也要与附属组ID比较。
查看附属组ID
//include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);
//成功返回附属组ID数量,出错返回-1
//include <grp.h> Linux
//unistd.h on FreeBSD,Mac Os X and Solaris
int setgroups(int ngroups, const gid_t grouplist[]);//<grp.h> Linux an Solaris
//unistd.h FreeBSD and Mac OS X
int initgroups(const char *username, git_t basegid);
//0 -1
getgroups将进程所属的用户的各个附属组ID填写到数组 gouplist中。 最多为gitsetsize个。
setgroups 超级用户调用易变为调用进程设置附属组ID表。grouplist是ID数组。ngroups说明了数组中的元素数量。不能大于NGROOUPS_MAX
initgroup用username确定组的成员关系,然后它调用setgroups,从而为该用户设置ID表。要有超级用户权限。 basegid是username在口令文件中的组ID
其他文件
几乎对于每个文件都有:
get函数 读取下一个记录。(个人理解是当前文件的offset的下一个记录,遍历条目比较取符合条件的常用这个。配合set和end)
set函数 打开相应的数据文件,如果没有打开就反绕该文件。如果希望在文件起始出处理,就调用这
end函数 关闭数据文件。
大多数还提供了某种搜索的函数如getpwnam等,如上图
登录账户记录:
utmp文件记录
登录是login填写这个数据结构。然后写入utmp和wtmp中。注销时init进程清除utmp。 wtmp是登录记录,使用last命令访问。who命令读取当前登录账户信息。
文件路径:
Linux3.2和FreeBSD 8.0 :/var/run/utmp 和 /var/log/wtmp
MacOS X 10.6.8 不存在
Solaris /uar/adm中
系统标识 uname gethostname
//sys/utsname.h
int uname(struct utsname *name);
//非负 -1
//unistd.h
int gethostname(char *name, int namelen); //返回主机名。
时间和日期
UNIX内核基本事件符文是UTC(Corrdinated Universal Time 自协调世界时),计算方法是:公元1970年1月1日00:00:00以来的秒数。数据类型是time_t,成为日历时间。
返回当前时间time
//time.h
time_t time(time_t *calptr);
//失败-1
如果参数非空,时间值也存到*calptr中;
获取制定时钟时间clock_gettime
POSX1.1实时扩展增加了对多个系统时钟的支持。
//sys/time.h
int clock_gettime(clockid_t clock_id, struct timespec *tsp));
//0 -1// 把上边得到的tsp结构结构化成clock_id 对应的精度。
int clock_getres(clockid_t clock_id, struct timespec *tsp);
//0 -1
- clock_id
- CLOCK_REALTIME clock_gettime和time类似。系统支持高精度时间值的话可能比time函数精度更高。
- tsp 接收结果
设定时间 clock_settime
//sys/time.h
int clock_settime(clock_id clock_id, const struct timespec *tsp);
// 0 -1
需要特权更改,有些时钟不能更改。
时间转换:
tm结构:
涉及到的函数:
//time.h
struct tm *getime(const time_t *calptr); //协调统一的时间(UTC)的年月日等
struct tm *localtime(const time_t *calptr); //考虑本地时区和夏令时标志
//出错返回NULLtime_t mktime(struct tm *tmptr);
//出错NULL
strftime类似printf,可以制定产生的字符串。
- buf 最终得到的结果
- maxsize buf数组长度
- format 类似printf
- tmptr 要格式化的时间值
例如:
strftime(buf2, 64, "time and data: %r, %a %b %d, %Y",tmp);
printf("%s\n",buf2);
//time.h
char *strptime(const char *restrict buf, const char *restrictformat , struct tm *restrict tmptr);
//成功指向下一个字符指针,否则NULL
TZ影响的函数localtime mktime strftime
%d, %Y",tmp);
printf("%s\n",buf2);
```c
//time.h
char *strptime(const char *restrict buf, const char *restrictformat , struct tm *restrict tmptr);
//成功指向下一个字符指针,否则NULL
[外链图片转存中…(img-ZOapVdR5-1569194808391)]
TZ影响的函数localtime mktime strftime
《unix环境高级编程》笔记4——系统数据文件和信息相关推荐
- 《UNIX环境高级编程》六系统数据文件和信息读书笔记
UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group等. 1.口令文件 口令文件的各字段包含在pwd.h>中定义的passwd ...
- Unix环境高级编程 笔记
Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...
- UNIX环境高级编程笔记
1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len); SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务: ...
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...
- UINX环境高级编程笔记 第3章 文件I/O
UNIX环境高级编程 第三章 文件I/O 3.1 引言 3.2 文件描述符 3.3 函数open和openat 3.4 函数creat 3.5 函数close 3.6 函数lseek 3.7 函数re ...
- UNIX环境高级编程笔记(2)- STDIN_FILENO、STDOUT_FILENO和stdin、stdout的区别
目录 前言 一.STDIN_FILENO.STDOUT_FILENO介绍 二.stdin.stdout介绍 三.代码例程 1.文件描述符的使用 2.流的使用 3.代码标记 总结 前言 本章主要通过UN ...
- 文件io(二)--unix环境高级编程笔记
在linux中,打开的文件组织结构如下: 与打开的文件相关的有三个数据结构,就是上图中的三部分. 在linux中,有一个进程表,每一个进程在进程表中有一个表项.每一个进程表项中都维护着一张打开文件的描 ...
- Unix环境高级编程笔记:12、高级IO
2019独角兽企业重金招聘Python工程师标准>>> 1.非阻塞IO 系统调用分成"低速"系统调用和其他系统调用.低速系统调用是可能会使进程永远阻塞的一类系统调 ...
- 函数sleep、nanosleep和clock_nanosleep(UNIX环境高级编程笔记)
#include <unistd.h> unsigned int sleep(unsigned int seconds); 返回值:0或未休眠完的秒数 此函 ...
最新文章
- 指定动态分区_重点解析!2021湖南中级职称评审动态趋势
- 编码问题(BOM头简单了解)
- mysql 关于日期时间的字段类型
- xdeepfm算法思维导图与代码
- ooalv自定义按钮、单击、双击、列编辑切换的事件用法
- Hibernate中使用未映射为主键的“id”字段进行查询的场景分析
- Linux 没有主清单属性,maven编译正常,运行报错:中没有主清单属性
- 遍历指定目录下的图片文件 显示在gridview 并添加点击事件
- 欧几里得和扩展欧几里得
- c语言的api_为什么C语言依然是必学的编程语言?
- linux新建mysql用户命令_使用MySQL命令行新建用户并授予权限
- 多元函数微分法及其应用
- 超简单直观理解懒加载(Lazyload)
- 【PAT】A1148 Werewolf - Simple Version
- EasyExcel实现Mysql数据库Excel数据导出
- 初使用maven遇到各种问题记录
- [转] 懒惰、急躁和傲慢 (Laziness, Impatience and hubris)
- 深度学习发展历程(2012年以前)
- 一天一篇latex刘海洋代码解析:1.2.5 遭遇数学公式
- 2019链塔大会|傅明副理事长:粤港澳大湾区将打造区块链离岸孵化器模式
热门文章
- 一文带你读懂异常检测(更新中)
- 计算机软件技术冒泡排序,太原理工大学计算机软件技术基础顺序表的冒泡排序实验报告.doc...
- 惊艳死人的古风短句,读一遍,感叹一生一世!
- 蓝牙耳机什么牌子性价比高?2021全新出炉,高人气蓝牙耳机榜单
- python 漏斗图
- torch7绘图:多图排列 gnuplot multiplot
- JavaScript中获取文本框数据的方法
- 赫尔德不等式证明闵可夫斯基不等式
- Ubuntu 启动时黑屏、显示 recovering journal,clean, xxx files,xxx blocks,只能从恢复模式启动
- 我说CMMI2.0 之过程资产开发(PAD)