Linux系统数据文件和信息

以下内容全部摘自UNIX环境高级编程(第3版)

口令文件

UNIX系统口令文件(POSIX.1则将其称为用户数据库)包含下图中所示的各字段,这些字段包含在<pwd.h>中定义的passwd结构中
passwd

POSIX.1定义了两个获取口令文件项的函数。在给出用户登录名或数值用户ID后,这两个函数就能查看相关项。

#include <pwd.h>
struct passwd    *getpwuid(uid_t uid);
struct passwd    *getpwname(const char *name);
两个函数返回值:若成功,返回指针;若出错,返回NULL

这两个函数都返回一个指向passwd结构的指针,passwd结构通常是函数内部的静态变量,只要调用任一相关函数,其内容就会被重写。
getpwuid函数有ls(1)程序使用,它将i节点中的数字用户ID映射为用户登录名。在键入登录名是,getpwnam函数由login(1)程序使用。

如果要查看整个口令文件,下列3个函数则可用与此种目的。

#include <pwd.h>
struct passwd *getpwent(void);
返回值:若成功,返回指针;若出错或到达文件尾端,返回NULL
void setpwent(void);
void endpwent(void);

调用getpwent时,它返回口令文件中的下一个记录项。在第一次调用该函数时,他打开它使用的各个文件。
函数setpwent转回password database的开始,endpwent则关闭这些文件。在使用getpwent查看完口令文件后,
一定要调用endpwent关闭这些文件。

阴影口令

加密口令存放在另一个通常称为阴影口令(shadow password)的文件中。该文件至少要包含用户名和加密口令。
与该口令相关的其他信息也可存放在该文件中。
shadow

在Linux3.2.0和Solaris 10中,与访问口令文件的一组函数相类似,有另一组函数可用于访问阴影口令文件。

#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
两个函数返回值:若成功,返回指针;若出错,返回值NULL
void setspent(void);
void endspent(void);

组文件

UNIX组文件(POSIX.1称其为组数据库)包含了下图所示字段。这些字段包含在

#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
两个函数返回值:若成功,返回指针;若出错,返回NULL

如同对口令文件进行操作的函数一样,这两个函数通常也返回一个静态变量的指针,在每次调用时都重写该静态变量。
如果需要搜索整个组文件,则需使用下列函数。

#include <grp.h>
struct group *getgrent(void);
返回值:若成功,返回指针;若出错或到达文件尾端,返回NULL
void setgrent(void);
void endgrent(void):

附属组ID

为了获取和设置附属组ID,提供了下列3个函数。

#include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);
返回值:若成功,返回附属组ID数量;若出错,返回-1

#include <grp.h>    /* on Linux */
#include <unistd.h>    /* on FreeBSD, Mac OS X, and Solaris */
int setgroups(int ngroups, const gid_t grouplist[]);

#include <grp.h>    /* on Linux and Solaris */
#include <unistd.h>    /* on FreeBSD and Mac OS X */
int initgroups(const char *username, gid_t basegid);
两个函数的返回值:若成功,返回0;若出错,返回-1

getgroups将进程所属用户的各附属组ID填写到数组grouplist中,填写入该数组的附属组ID数最多为gidsetsize个。
实际填写到数组中的附属组ID数由函数返回。
作为一种特殊情况,如若gidsetsize为0,则函数只返回附属组ID数,而对数组grouplist则不做修改。(这使调用者
可以确定grouplist数组的长度,以便进行分配。)
setgroups可由超级用户调用以便为调用进程设置附属组ID表。grouplist是组ID数组,而ngroups说明了数组中的元素数。
ngroups的值不能大于NGROUPS_MAX

其他数据文件

  1. get函数
  2. set函数
  3. end函数
  4. 数据文件支持的某种形式的键搜索。

accessSystemFile

系统标识

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

#include <sys/utsname.h>
int uname(struct utsname *name);
返回值:若成功,返回非负值;若出错,返回-1

struct utsname {
    char sysname[];        /* name of the operating system */
    char nodename[];        /* name of this node */
    char release[];        /* current release of operating systm */
    char version[];        /* current version of this release */
    char machine[];        /* name of hardware type */
};

历史上,BSD派生的系统提供gethostname函数,它返回主机名,该名字通常就是TCP/IP网络上主机的名字。

#include <unistd.h>
int gethostname(char *name, int namelen);
返回值:若成功,返回0;若失败,返回-1

namelen参数指定name缓冲区长度,如若提供足够的空间,则通过name返回的字符串以null字节结尾。
如若没有提供足够的空间,则不能明确是否字符串以null字节结尾。

时间和日期例程

由UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time, UTC)公元1970年1月1日00:00:00这一特定
时间以来经过的秒数。UNIX在这方面与其他操作系统的区别是:
1. 以协调统一时间而非本地时间计时
2. 可自动进行切换,如变换到夏令时
3. 将时间和日期作为一个量值保存

time函数返回当前时间和日期

#include <time.h>
time_t time(time_t *calptr);
返回值:若成功,返回时间值;若出错,返回-1

时间值作为函数值返回。如果参数非空,则时间值也存放在由calptr指向的单元内。
clock_gettime函数可用于获取指定时钟的时间,返回的时间在timespec结构中,它把时间表示为秒和纳秒
clocktype

#include <sys/time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tsp);
返回值:若成功,返回0;若失败,返回-1

当时钟ID设置为CLOCK_REALTIME时,clock_gettime函数提供了与time函数类似的功能,不过在系统支持
高精度时间值的情况下,clock_gettime可能比time函数得到更高精度的时间值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值