Linux - 访问系统信息
passwd文件
passwd 是一个文本文件,用于定义系统的用户账号,该文件位于“/etc”目录下
包含一个系统账户列表,给出每个账户一些有用的信息,例如,用户 ID、组 ID、主目录、shell等
由于所有用户都对passwd有读权限,所以该文件中只定义用户账号,而不保存口令
passwd文件中每行定义一个用户账号,一行中又划分为多个字段定义用户的账号的不同属性,各字段用“:”隔开
passwd文件字段说明
account
使用者在系统中的名字,它不能包含大写字母
password
用户口令,出于安全考虑,不使用该字段保存口令,而用字母“x”来填充该字段,真正的密码保存在shadow文件
UID
用户 ID 号,惟一表示某用户的数字
GID
用户所属的私有组号,该数字对应group文件中的GID
GECOS
这字段是可选的,通常用于保存用户命名的信息
Directory
用户的主目录,用户成功登录后的默认目录
shell
用户所使用的shell,如该字段为空则使用“/bin/sh”
shadow文件
每行定义一个用户信息,行中各字段各字段用“:”隔开
为进一步提高安全性,shadow文件中保存的是已加密的口令
登录名
加密口令
口令上次更改时距1970年1月1日的天数
口令更改后不可以更改的天数
口令更改后必须再更改的天数(有效期)
口令失效前警告用户的天数
口令失效后距账号被查封的天数
账号被封时距1970年1月1日的天数
保留未用
存取passwd文件信息的函数
根据uid或登录名查看相关记录
头文件
#include <sys/types.h>
#include <pwd.h>
函数
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
返回值
成功返回指针
出错返回NULL
查看整个口令文件
头文件
#include <sys/types.h>
#include <pwd.h>
函数
struct passwd *getpwent(void);
从密码文件(/etc/passwd)中读取一项用户数据
第一次调用时会取得第一位用户数据,之后每调用一次就会返回下一项数据
直到已无任何数据时返回NULL
void setpwent(void);
void endpwent(void);
group文件
逻辑地组织用户账号集合的途径,允许用户在组内共享文件
系统上的每一个文件都有一个用户和一个组的属主,使用“ls –l”命令可以看到每一个文件的属主和组
每个组在/etc/group文件中有一行记录,格式如下
groupname : passwd : GID : userlist
group字段说明
groupname:是组的名字
passwd:组的加密口令
GID:系统区分不同组的ID,在/etc/passwd域中的GID域是用这个数来指定用户的缺省组
userlist:用“,”分开的用户名,列出的是这个组 的成员
用户组口令文件(gshadow)
用于定义用户组口令、组管理员等信息
该文件只有root用户可以读取
gshadow文件中每行定义一个用户组信息,行中各字段间用“:”分隔,每行记录的格式为
groupname : encrypted password: group administrators: group members
各字段含义
groupname:用户组名称,该字段与group文件中的组名称 对应
encrypted password:用户组口令,该字段用于保存已加密的口令
group administrators:组的管理员账号,管理员有权对该组添加删除账号
group members:属于该组的用户成员列表,列表中多个用户间用“,”分隔
存取group文件信息的函数
根据gid或组名查看相关记录
头文件
#include <sys/types.h>
#include <grp.h>
函数
struct group *getgruid(gid_t gid);
struct group *getgrnam(const char *name);
返回值
若成功为指针
若出错为NULL
查看整个组文件
头文件
#include <sys/types.h>
#include <grp.h>
函数
struct group *getgrent(void);
返回值
若成功为指针
若出错或到达文件尾端为NULL
void setgrent(void);
void endgrent(void);
命令行参数
main()函数
int main(int argc, char *argv[]);
参数说明
argc:命令行中的字符串个数
argv[ ]:指向命令行中的各个字符串
场景举例
命令行
test how are you
参数值
argc=4
argv[0] 保存字符串"test"的首地址argv[1]保存字符串"how"的首地址argv[2]保存字符串"are"的首地址argv[3]保存字符串"you"的首地址
getopt()函数
功能
分析命令行参数,返回argv中下一个选项字符,此参数会对应参数optstring 中的字母.
函数原型
int getopt(int argc, char * const argv[ ], const char * optstring);
参数说明
argc由main()传递的参数个数。
argv传递的参数内容。
optstring 代表欲处理的选项字符串。
返回值
找到符合的参数,返回此参数字母。
参数不包含在参数optstring 的选项字母,返回“?”字符。
分析结束,返回-1
参数说明
参数argc和argv来源与main()函数
opstring:欲处理的选项字符串
如果opstring里的字母后接单个冒号“:”,则表示还有相关的参数,参数紧跟在选项后或者以空格隔开,全域变量optarg 将指向此额外参数
如果opstring后跟两个冒号,表示该选项后必须跟一个参数,参数必须紧跟在选项后不能以空格隔开
如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符
若不希望getopt()印出错信息,只要将全域变量opterr设为0即可
getopt()函数依赖的全局变量
extern char *optarg
选项的参数指针
extern int optind
下一次调用getopt时,从optind存储位置处重新开始检查选项
extern int opterr
当opterr=0时,getopt不向stderr输出错误信息
extern int optopt
当命令行选项字符不包括在optstring中或选项缺少必要的参数时,该选项存储在optopt中,getopt返回‘?’
getopt()函数调用形式分析
getopt处理以‘-’开头的命令行参数
optstring="ab:c::d::"
命令行为getopt.exe -a -b host –ckeke -d haha
-a就是选项元素,去掉‘-’,a就是选项
host是b的参数,keke是c的参数
haha并不是d的参数,因为它们中间有空格隔开
环境变量
基本函数
头文件
#include <stdlib.h>
函数原型
char *getenv(const char *name);
int putenv(char *string);
int setenv(const char *name, const char *value, int overwirte);
void unsetenv(const char *name);
getenv()函数
功能
访问指定的一个环境变量
函数原型
char* getenv(const char *name)
参数说明
name:需要访问的变量名字
返回值
访问的环境变量存在:返回一个字符串。
否则,返回NULL。
putenv()函数
功能
把字符串加到当前环境中
用来改变或增加环境变量的内容
函数原型
int putenv(char *string)
参数说明
string :环境变量的内容
返回值
执行成功,返回0
否则,返回-1。
错误代码
ENOMEM, 内存不足
setenv()函数
功能
用来改变或增加环境变量的内容
函数原型
int setenv(const char *name, const char *value, int overwirte)
参数说明
name: 环境变量名称字符串
value: 环境变量内容
overwirte:决定是否要改变已存在的环境变量
如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容。
如果overwrite为0,且该环境变量已有内容,则参数value会被忽略
返回值
执行成功,返回0
否则,返回-1。
错误代码
ENOMEM, 内存不足
unsetenv()函数
功能
清除某个特定的环境变量
函数原型
int unsetenv(const char *name)
参数说明
name: 环境变量名称字符串
返回值
执行成功,返回0
否则,返回-1
时间相关函数
头文件
#include <time.h>
函数原型
time_t time(time_t *tloc);
返回从1970年1月1日0点以来的秒数
char *ctime(const time_t *clock);
将秒数转化为字符串
struct tm *gmtime(const time_t *timer);
将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间
struct tm *localtime(const time_t *timer);
将日历时间转化为本地时间
tm结构定义
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份, 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6] */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365]*/
int tm_isdst; /* 夏令时标识符,实行夏令时,tm_isdst为正*/
};
功能
计算两个时间之间的差值
函数原型
double difftime(time_t time1, time_t time2);
说明
返回值等于time1?time2
单位是秒
自定义时间格式
功能
将时间格式化成所需形式
函数原型
size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
说明
可根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中
最多向strDest中存放maxsize个字符
函数返回向strDest指向的字符串中放置的字符数
举例
date所指定的日期对应于以下格式
“%a %b %d %Y %H:%M:%S”
格式化串定义
%a:星期几的简写
%A:星期几的全称
%b:月分的简写
%B:月份的全称
%c:标准的日期的时间串
%C:年份的后两位数字
%d:十进制表示的每月的第几天
%D:月/日/年
%e:在两字符域中,十进制表示的每月的第几天
%F:年-月-日
%g:年份的后两位数字,使用基于周的年
%G:年分,使用基于周的年
%h:简写的月份名
%H: 24小时制的小时
%I: 12小时制的小时
%j:十进制表示的每年的第几天
%m:十进制表示的月份
%M:十时制表示的分钟数
%n:新行符
%p:本地的AM或PM的等价显示
%r:12小时的时间
%R:显示小时和分钟:hh:mm
%S:十进制的秒数
%t:水平制表符
%T:显示时分秒:hh:mm:ss
%u:每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U:第年的第几周,把星期日做为第一天(值从0到53)
%V:每年的第几周,使用基于周的年
%w:十进制表示的星期几(值从0到6,星期天为0)
%W:每年的第几周,把星期一做为第一天(值从0到53)
%x:标准的日期串
%X:标准的时间串
%y:不带世纪的十进制年份(值从0到99)
%Y:带世纪部分的十进制年份
%z,%Z:时区名称,如果不能得到时区名称则返回空字符
strptime()函数
功能
以表示日期与时间的字符串作为参数,创建一个tm结构
函数原型
char *strptime(const char *buf, const char *format, struct tm *timeptr);
说明
format的组成与strftime的格式化字符串完全相同
strptime的动作与sscanf相似,搜索字符串,查找标识的域,然后将他们写入变量
返回值说明
返回一个指向转换操作中最后一个处理字符之后的字符的指针
如遇到不可转换的字符,转换操作停止在该处
调用程序需要检测以确保所传递的字符都是可以写入tm结构的有意义的字符
定时器函数setitimer()
功能
设置定时器,支持多种定时器
函数原型
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
struct itimerval结构定义
struct itimerval {
struct timeval it_interval; /*定时器周期*/
struct timeval it_value; /*定时器剩的时间,为0时发信号*/
};
struct timeval结构定义
struct timeval {
long tv_sec; /*秒*/
long tv_usec; /*微秒,1秒=1000000微秒*/
};
参数说明
which:逻辑定时器类型
ITIMER_REAL:按实际时间计时,计时到达时向进程发送SIGALRM信号
ITIMER_VIRTUAL:计算进程在用户态执行的时间,计时到达将发送SIGVTALRM信号给进程
ITIMER_PROF:进程执行时及系统执行该进程时都计时
计时到达将发送SIGPROF信号给进程
与ITIMER_VIRTUAL是一对,该定时器经常用来统计进程在用户态和核心态花费的时间
value:指明定时器的时间
ovalue:如果不为空,则保存上次调用设定的值
返回值
成功时,返回0
错误时,返回-1
setitimer()示例
运行结果
localhost:~$ ./settimertest process id is 579 Catch a signal – SIGVTALRM (0.5秒) Catch a signal – SIGALRM (1秒) Catch a signal – SIGVTALRM (1秒) Catch a signal – SIGVTALRM (1.5秒) Catch a signal – SIGALRM (2秒) Catch a signal –SIGVTALRM (2秒)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。