chap 6 Linux 访问系统信息.ppt_第1页
chap 6 Linux 访问系统信息.ppt_第2页
chap 6 Linux 访问系统信息.ppt_第3页
chap 6 Linux 访问系统信息.ppt_第4页
chap 6 Linux 访问系统信息.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 访问系统信息,戴瑾 南大金陵学院信息科学与工程系,2,主要内容,用户帐户信息 命令行参数获取方法 环境变量信息 时间和日期例程,3,passwd文件,passwd 是一个文本文件,用于定义系统的用户账号,该文件位于“/etc”目录下 包含一个系统账户列表,给出每个账户一些有用的信息,例如,用户 ID、组 ID、主目录、shell等 由于所有用户都对passwd有读权限,所以该文件中只定义用户账号,而不保存口令 passwd文件中每行定义一个用户账号,一行中又划分为多个字段定义用户的账号的不同属性,各字段用“:”隔开,用户帐户信息,4,passwd文件示例,用户帐户信息,5,passwd

2、文件字段说明,account 使用者在系统中的名字,它不能包含大写字母 password 用户口令,出于安全考虑,不使用该字段保存口令,而用字母“x”来填充该字段,真正的密码保存在shadow文件 UID 用户 ID 号,惟一表示某用户的数字 GID 用户所属的私有组号,该数字对应group文件中的GID GECOS 这字段是可选的,通常用于保存用户命名的信息 Directory 用户的主目录,用户成功登录后的默认目录 shell 用户所使用的shell,如该字段为空则使用“/bin/sh”,用户帐户信息,6,shadow文件,每行定义一个用户信息,行中各字段各字段用“:”隔开 为进一步提高安

3、全性,shadow文件中保存的是已加密的口令 登录名 加密口令 口令上次更改时距1970年1月1日的天数 口令更改后不可以更改的天数 口令更改后必须再更改的天数(有效期) 口令失效前警告用户的天数 口令失效后距账号被查封的天数 账号被封时距1970年1月1日的天数 保留未用,用户帐户信息,7,passwd结构,结构名称 struct passwd,用户帐户信息,8,存取passwd文件信息的函数(1),根据uid或登录名查看相关记录 头文件 #include #include 函数 struct passwd *getpwuid(uid_t uid); struct passwd *getpw

4、nam(const char *name); 返回值 成功返回指针 出错返回NULL,用户帐户信息,9,获取用户信息示例,用户帐户信息,10,存取passwd文件信息的函数(2),查看整个口令文件 头文件 #include #include 函数 struct passwd *getpwent(void); 从密码文件(/etc/passwd)中读取一项用户数据 第一次调用时会取得第一位用户数据,之后每调用一次就会返回下一项数据 直到已无任何数据时返回NULL void setpwent(void); void endpwent(void);,用户帐户信息,11,getpwnam的实现,str

5、uct passwd * getpwnam(const char *name) struct passwd *ptr; setpwent(); while( (ptr = getpwent() != NULL ) if ( strcmp(name, ptr-pw_name) = 0 ) break; endpwent(); return ptr; ,用户帐户信息,12,group文件,逻辑地组织用户账号集合的途径,允许用户在组内共享文件 系统上的每一个文件都有一个用户和一个组的属主,使用“ls l”命令可以看到每一个文件的属主和组 每个组在/etc/group文件中有一行记录,格式如下 gro

6、upname : passwd : GID : userlist group字段说明 groupname:是组的名字 passwd:组的加密口令 GID:系统区分不同组的ID,在/etc/passwd域中的GID域是用这个数来指定用户的缺省组 userlist:用“,”分开的用户名,列出的是这个组的成员,用户帐户信息,13,group文件示例,用户帐户信息,14,用户组口令文件(gshadow),用于定义用户组口令、组管理员等信息 该文件只有root用户可以读取 gshadow文件中每行定义一个用户组信息,行中各字段间用“:”分隔,每行记录的格式为 groupname : encrypted

7、password: group administrators: group members 各字段含义 groupname:用户组名称,该字段与group文件中的组名称对应 encrypted password:用户组口令,该字段用于保存已加密的口令 group administrators:组的管理员账号,管理员有权对该组添加删除账号 group members:属于该组的用户成员列表,列表中多个用户间用“,”分隔,用户帐户信息,15,gshadow文件示例,用户帐户信息,16,group结构,结构名称 struct group,用户帐户信息,17,存取group文件信息的函数(1),根据g

8、id或组名查看相关记录 头文件 #include #include 函数 struct group *getgruid(gid_t gid); struct group *getgrnam(const char *name); 返回值 若成功为指针 若出错为NULL,用户帐户信息,18,存取group文件信息的函数(2),查看整个组文件 头文件 #include #include 函数 struct group *getgrent(void); 返回值 若成功为指针 若出错或到达文件尾端为NULL void setgrent(void); void endgrent(void);,用户帐户信息

9、,19,主要内容,用户帐户信息 命令行参数获取方法 环境变量信息 时间和日期例程,20,命令行参数,main()函数 int main(int argc, char *argv); 参数说明 argc:命令行中的字符串个数 argv:指向命令行中的各个字符串 场景举例 命令行 test how are you 参数值 argc=4 argv0 保存字符串test的首地址argv1保存字符串how的首地址argv2保存字符串are的首地址argv3保存字符串you的首地址,命令行参数获取方法,21,命令行选项,形式 sort r file ls al,命令行参数获取方法,22,getopt()函

10、数,功能 分析命令行参数,返回argv中下一个选项字符,此参数会对应参数optstring 中的字母. 函数原型 int getopt(int argc, char * const argv , const char * optstring); 参数说明 argc由main()传递的参数个数。 argv传递的参数内容。 optstring 代表欲处理的选项字符串。 返回值 找到符合的参数,返回此参数字母。 参数不包含在参数optstring 的选项字母,返回“?”字符。 分析结束,返回-1。,命令行参数获取方法,23,getopt()函数(续),参数说明 参数argc和argv来源与main(

11、)函数 opstring:欲处理的选项字符串 如果opstring里的字母后接单个冒号“:”,则表示还有相关的参数,参数紧跟在选项后或者以空格隔开,全域变量optarg 将指向此额外参数 如果opstring后跟两个冒号,表示该选项后必须跟一个参数,参数必须紧跟在选项后不能以空格隔开 如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符 若不希望getopt()印出错信息,只要将全域变量opterr设为0即可,命令行参数获取方法,24,getopt()函数依赖的全局变量,extern char *optarg 选项的参数指针 extern int opti

12、nd 下一次调用getopt时,从optind存储位置处重新开始检查选项 extern int opterr 当opterr=0时,getopt不向stderr输出错误信息 extern int optopt 当命令行选项字符不包括在optstring中或选项缺少必要的参数时,该选项存储在optopt中,getopt返回?,命令行参数获取方法,25,getopt()函数调用形式分析,getopt处理以-开头的命令行参数 optstring=ab:c:d: 命令行为getopt.exe -a -b host ckeke -d haha -a就是选项元素,去掉-,a就是选项 host是b的参数,k

13、eke是c的参数 haha并不是d的参数,因为它们中间有空格隔开,命令行参数获取方法,26,getopt()函数示例1,$ ./argopt i lr hi there f fred.c q option: i option: l option: r filename: fred.c unknown option: q argument: hi there,命令行参数获取方法,27,getopt()函数示例2,命令行参数获取方法,28,主要内容,用户帐户信息 命令行参数获取方法 环境变量信息 时间和日期例程,29,基本函数 头文件 #include 函数原型 char *getenv(cons

14、t char *name); int putenv(char *string); int setenv(const char *name, const char *value, int overwirte); void unsetenv(const char *name);,环境变量,环境变量信息,30,getenv()函数,功能 访问指定的一个环境变量 函数原型 char* getenv(const char *name) 参数说明 name:需要访问的变量名字 返回值 访问的环境变量存在:返回一个字符串。 否则,返回NULL。,命令行参数获取方法,31,putenv()函数,功能 把字符串

15、加到当前环境中 用来改变或增加环境变量的内容 函数原型 int putenv(char *string) 参数说明 string :环境变量的内容 返回值 执行成功,返回0 否则,返回-1。 错误代码 ENOMEM, 内存不足,命令行参数获取方法,32,setenv()函数,功能 用来改变或增加环境变量的内容 函数原型 int setenv(const char *name, const char *value, int overwirte) 参数说明 name: 环境变量名称字符串 value: 环境变量内容 overwirte:决定是否要改变已存在的环境变量 如果overwrite不为0,

16、而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容。 如果overwrite为0,且该环境变量已有内容,则参数value会被忽略 返回值 执行成功,返回0 否则,返回-1。 错误代码 ENOMEM, 内存不足,命令行参数获取方法,33,unsetenv()函数,功能 清除某个特定的环境变量 函数原型 int unsetenv(const char *name) 参数说明 name: 环境变量名称字符串 返回值 执行成功,返回0 否则,返回-1,命令行参数获取方法,34,getenv()/putenv()的基本使用,环境变量信息,35,getenv()/putenv()的基本使

17、用,环境变量信息,36,getenv()/putenv()的基本使用,运行结果,环境变量信息,37,定义 #include extern char *environ; 环境变量结构,环境变量environ,环境变量信息,38,环境变量environ的遍历,环境变量信息,39,主要内容,用户帐户信息 命令行参数获取方法 环境变量信息 时间和日期例程,40,时间相关函数,头文件 #include 函数原型 time_t time(time_t *tloc); 返回从1970年1月1日0点以来的秒数 char *ctime(const time_t *clock); 将秒数转化为字符串 struct

18、 tm *gmtime(const time_t *timer); 将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间 struct tm *localtime(const time_t *timer); 将日历时间转化为本地时间,时间和日期例程,41,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

19、_mon; /* 月份, 取值区间为0,11 */ int tm_year; /* 年份,其值等于实际年份减去1900 */ int tm_wday; /* 星期 取值区间为0,6 */ int tm_yday; /* 从每年的1月1日开始的天数 取值区间为0,365*/ int tm_isdst; /* 夏令时标识符,实行夏令时,tm_isdst为正*/ ;,时间和日期例程,42,time()函数示例,时间和日期例程,43,gmtime()函数示例,时间和日期例程,44,gmtime()函数示例,时间和日期例程,45,指定时间,时间和日期例程,46,时间测量,功能 计算程序执行时间 函数原型

20、 int gettimeofday(struct timeval *tv, struct timezone *tz); 参数 tv:保存时间 tz:一般用NULL 说明 时间精度为微秒,时间和日期例程,47,时间测量示例,时间和日期例程,48,时间差计算,功能 计算两个时间之间的差值 函数原型 double difftime(time_t time1, time_t time2); 说明 返回值等于time1time2 单位是秒 计算时间差的另一种方法,时间和日期例程,49,自定义时间格式,功能 将时间格式化成所需形式 函数原型 size_t strftime(char *strDest, s

21、ize_t maxsize, const char *format, const struct tm *timeptr); 说明 可根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中 最多向strDest中存放maxsize个字符 函数返回向strDest指向的字符串中放置的字符数 举例 date所指定的日期对应于以下格式 “%a %b %d %Y %H:%M:%S”,时间和日期例程,50,格式化串定义,%a:星期几的简写 %A:星期几的全称 %b:月分的简写 %B:月份的全称 %c:标准的日期的时间串 %C:年份的后两位数字 %d:十进制表示

22、的每月的第几天 %D:月/日/年 %e:在两字符域中,十进制表示的每月的第几天 %F:年-月-日 %g:年份的后两位数字,使用基于周的年 %G:年分,使用基于周的年 %h:简写的月份名 %H: 24小时制的小时 %I: 12小时制的小时 %j:十进制表示的每年的第几天,时间和日期例程,51,格式化串定义,%m:十进制表示的月份 %M:十时制表示的分钟数 %n:新行符 %p:本地的AM或PM的等价显示 %r:12小时的时间 %R:显示小时和分钟:hh:mm %S:十进制的秒数 %t:水平制表符 %T:显示时分秒:hh:mm:ss %u:每周的第几天,星期一为第一天 (值从0到6,星期一为0) %

23、U:第年的第几周,把星期日做为第一天(值从0到53) %V:每年的第几周,使用基于周的年 %w:十进制表示的星期几(值从0到6,星期天为0) %W:每年的第几周,把星期一做为第一天(值从0到53) %x:标准的日期串 %X:标准的时间串 %y:不带世纪的十进制年份(值从0到99) %Y:带世纪部分的十进制年份 %z,%Z:时区名称,如果不能得到时区名称则返回空字符,时间和日期例程,52,strptime()函数,功能 以表示日期与时间的字符串作为参数,创建一个tm结构 函数原型 char *strptime(const char *buf, const char *format, struct

24、 tm *timeptr); 说明 format的组成与strftime的格式化字符串完全相同 strptime的动作与sscanf相似,搜索字符串,查找标识的域,然后将他们写入变量 返回值说明 返回一个指向转换操作中最后一个处理字符之后的字符的指针 如遇到不可转换的字符,转换操作停止在该处 调用程序需要检测以确保所传递的字符都是可以写入tm结构的有意义的字符,时间和日期例程,53,自定义时间格式示例,时间和日期例程,54,时间的其他用途,功能 用作随机数的种子,时间和日期例程,55,定时器函数setitimer(),功能 设置定时器,支持多种定时器 函数原型 int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); struct itimerval结构定义

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论