文章目录

  • 系统数据文件和信息
    • 口令文件
    • 获取口令文件 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——系统数据文件和信息相关推荐

  1. 《UNIX环境高级编程》六系统数据文件和信息读书笔记

    UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group等. 1.口令文件 口令文件的各字段包含在pwd.h>中定义的passwd ...

  2. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  3. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  4. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...

  5. 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 ...

  6. UNIX环境高级编程笔记(2)- STDIN_FILENO、STDOUT_FILENO和stdin、stdout的区别

    目录 前言 一.STDIN_FILENO.STDOUT_FILENO介绍 二.stdin.stdout介绍 三.代码例程 1.文件描述符的使用 2.流的使用 3.代码标记 总结 前言 本章主要通过UN ...

  7. 文件io(二)--unix环境高级编程笔记

    在linux中,打开的文件组织结构如下: 与打开的文件相关的有三个数据结构,就是上图中的三部分. 在linux中,有一个进程表,每一个进程在进程表中有一个表项.每一个进程表项中都维护着一张打开文件的描 ...

  8. Unix环境高级编程笔记:12、高级IO

    2019独角兽企业重金招聘Python工程师标准>>> 1.非阻塞IO 系统调用分成"低速"系统调用和其他系统调用.低速系统调用是可能会使进程永远阻塞的一类系统调 ...

  9. 函数sleep、nanosleep和clock_nanosleep(UNIX环境高级编程笔记)

    #include <unistd.h> unsigned int sleep(unsigned int seconds);               返回值:0或未休眠完的秒数   此函 ...

最新文章

  1. 指定动态分区_重点解析!2021湖南中级职称评审动态趋势
  2. 编码问题(BOM头简单了解)
  3. mysql 关于日期时间的字段类型
  4. xdeepfm算法思维导图与代码
  5. ooalv自定义按钮、单击、双击、列编辑切换的事件用法
  6. Hibernate中使用未映射为主键的“id”字段进行查询的场景分析
  7. Linux 没有主清单属性,maven编译正常,运行报错:中没有主清单属性
  8. 遍历指定目录下的图片文件 显示在gridview 并添加点击事件
  9. 欧几里得和扩展欧几里得
  10. c语言的api_为什么C语言依然是必学的编程语言?
  11. linux新建mysql用户命令_使用MySQL命令行新建用户并授予权限
  12. 多元函数微分法及其应用
  13. 超简单直观理解懒加载(Lazyload)
  14. 【PAT】A1148 Werewolf - Simple Version
  15. EasyExcel实现Mysql数据库Excel数据导出
  16. 初使用maven遇到各种问题记录
  17. [转] 懒惰、急躁和傲慢 (Laziness, Impatience and hubris)
  18. 深度学习发展历程(2012年以前)
  19. 一天一篇latex刘海洋代码解析:1.2.5 遭遇数学公式
  20. 2019链塔大会|傅明副理事长:粤港澳大湾区将打造区块链离岸孵化器模式

热门文章

  1. 一文带你读懂异常检测(更新中)
  2. 计算机软件技术冒泡排序,太原理工大学计算机软件技术基础顺序表的冒泡排序实验报告.doc...
  3. 惊艳死人的古风短句,读一遍,感叹一生一世!
  4. 蓝牙耳机什么牌子性价比高?2021全新出炉,高人气蓝牙耳机榜单
  5. python 漏斗图
  6. torch7绘图:多图排列 gnuplot multiplot
  7. JavaScript中获取文本框数据的方法
  8. 赫尔德不等式证明闵可夫斯基不等式
  9. Ubuntu 启动时黑屏、显示 recovering journal,clean, xxx files,xxx blocks,只能从恢复模式启动
  10. 我说CMMI2.0 之过程资产开发(PAD)