系统数据库
组数据库包括的信息有:组名,组的数字 ID,组中的用户列表
用户数据库包含的信息有:用户名,用户的数字 ID,组的数字 ID,初始化的工作目录,和初始化的用户程序
数据库的访问
组数据库的访问
#include <sys/types.h>
#include <grp.h>
//返回指针,它指向一个 struct group 类型的对象,包含了组数据库的入口
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
用户数据库的访问
#include <sys/types.h>
#include <pwd.h>
//返回一个指针,指向 structpasswd 类型的一个对象,它包含了用户数据库的入口
struct paswd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
数据交换形式
归档/交换文件格式
扩展的 tar 格式
扩展的 cpio 格式:面向字节的归档格式,包括了文件头,文件名和文件内容
大流量:该格式被看作是字节流
同 步
信号量特征
头文件<semaphore.h>定义了 sem_t 类型,它用于信号量操作中
sem_t 代表了信号量,用文件描述符能够实现这些信号量,应用程序能够打开至少{OPEN_MAX}这么多的文件和信号量
标准中,头文件<semaphore.h>能使头文件<sys/types.h>和<fcntl.h>中的符号可见
信号量函数
初始化一个未命名的信号量
#include <semaphore.h>
/* 如 {_POSIX_SEMAPHORES}定义了:该函数被用来初始化 sem 引用的未命名信号量
* 在成功调用该函数后,sem_wait(),sem_trywait(),sem_post(),sem_destroy()的调用中
*信号量将被用到
* 如 pshared != 0,信号量将在进程中被共享,任何可以访问信号量 sem 的进程都可以使用 sem
*只有 sem 能被用来进行同步
*如 pshared = 0,则结构不确定
*如标准中未定义,可由执行者来支持该函数
*/
int sem_init(sem_t *sem, int pshared, unsigned int value);
删除一个未命名信号量
#include <semaphore.h>
// 如 {_POSIX_SEMAPHORES}定义了,该函数用来删除 sem 引用的未命名信号量
//只有在 sem_init()中创建的信号量才能被该函数删除
int sem_destroy(sem_t *sem);
初始化/打开一个命名信号量
#include <sempaphore.h>
//如 {_POSIX_SEMAPHORES}定义了,该函数在进程和命名信号量之间创建一个链接
//接着调用带有信号量名 name 的该函数,进程引用与 name 相关的信号量
//该信号量在一些函数的调用中用到, 如sem_wait(),sem_trywait(),sem_post,和 sem_close()
//信号量一直可用知道调用函数 sem_close(),_exit,exec()关闭它
//oflag 控制是否信号量由 sem_open()创建或者仅被它访问
sem_t *sem_open(const char *name, int oflag, ...);
关闭一个命名信号量
#include <semphore.h>
//如 {_POSIX_SEMAPHORES}定义了,该函数用来提示调用进程已经完成使用 sem 所指明的信号量
//该函数释放系统资源,这些资源被拥有该信号量的进程占有
int sem_close(sem_t *sem);
移走一个命名信号量
#include <semaphore.h>
//该函数将移走被字符串 name 命名的信号量
//如 该信号量当前被其他进程引用,则该函数对信号量状态没有影响
//如 一个和更多的进程打开了该信号量,则销毁该信号量被延迟知道所有的信号量被 sem_close(), _exit(),exec 关闭
int sem_unlink(const char *name);
锁定一个信号量
#include <semaphore.h>
//sem_wait()锁定 sem 引用的一个信号量,对该信号进行锁定操作
//如 信号量 = 0,调用进程将不会返回直到锁定了这个信号量或 被一个信号中断
//Sem_trywait()只能在信号量当前没被锁定的情况下锁定它,否则将不会锁定信号量
//成功返回,信号量的状态将被锁定直到 sem_post()被调用并且成功返回
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
解锁一个信号量
#include <semaphore.h>
//该函数通过对一个信号量的解锁操作解锁一个被 sem引用的信号量
//如 该操作的结果,信号量值 = 正数,则没有进程被锁定来等待一个信号量解锁,信号量值是单一的增加
//如 信号量值 = 0,则进程被锁定来等待一个信号量被允许从 sem_wait()成功返回
int sem_post(sem_t *sem);
取得一个信号量值
#include <semaphore.h>
//该函数更新参数 sval 所引用的位置,在不改变信号量状态的情况下得到信号量值
//更新的值代表了一个确切的值,它产生在调用中的一个不定时刻,但它返回给调用进程是不一定需要信号量的确定值
//如 sem 被锁定,则 sem_getvalue()返回的值为 0,或负数,它代表了等待信号量的进程数
int sem_getvalue(sem_t *sem, int *sval);
内存管理
内存锁定和内存映象文件以页的方式定义
执行者可根据页大小的规范限制和排列锁定和映象范围
页的大小,以字节为单位,是一个可配置系统变量。默认为 1B
内存锁定保证了一部分地址空间的驻留
内存锁定函数
锁定/解锁进程地址空间
#include <sys/mman.h>
//mlockall()使进程地址空间所映射的所有页面成为内存驻留区,直到解锁或者进程退出或者execs 另一个进程映象
//flags 决定了是否被锁定的页面是由当前,(将来,或两者都是)的进程地址空间映射的
//Munlockall()解锁当前所有的进程地址空间映射页面
//所有映射到进程地址空间的页面,调用了该函数,将不会被锁定,
//除非有中断调用 mlockall() 确定,MCL_CURRENT 或 并发调用 mlockall()确定MCL_CURRENT
int mlockall(int flags);
int munlockall(void);
锁定/解锁一连续的地址空间
#include <sys/mman.h>
// mlock()使一个范围的进程地址空间成为内存驻留区
//(addr :空间的起始地址,len :空间长度)直到解锁或 进程退出或者 execs 另一个进程映象
// munlock()解锁一个范围的进程地址空间
//( addr:空间的起始地址,len :空间长度)
int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
内存映象函数
映象进程地址到一个内存目标
#include <sys/mman.h>
//该函数在一个进程的地址空间和内存对象间创建一个映射
// 调用格式如: pa=mmap(addr,len,prot,flags,fildes,off)
//pa: 进程进程地址空间的地址,由执行者定义(addr和 flags)
// len: 空间长度,fildes: 内存对象,off: 偏移量
//函数成功调用返回 pa,空间地址范开始与 pa,长度为连续的 len 个字节
//内存对象开始与 off,长度为 len 字节
// 参数 prot 决定了读,写,执行,或一些映射数据的访问活动的集合
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
取消以前映射地址的映射关系
#include <sys/mman.h>
//移去任何包含有进程地址空间的页面的映射关系
//该进程地址空间起始于 addr, 长度为 len 字节
int munmap(void *addr, size_t len);
改变内存保护
#include <sys/mman.h>
//更改访问的保护活动,由参数 prot 确定
//访问对象是一部分进程地址空间,起始于 addr,长度为 len字节
int mprotet(const void *addr, size_t len, int prot);
内存对象同步
#include <sys/mman.h>
//将所有更改了的数据写到拥有存储的地方,它包含了进程地址空间,起始于 addr,长度为 len 字节
//如 没有这样的存储区域存在,则给函数没有作用
//该函数须保证写操作的完成符合所定义的同步 I/O数据的一致完成性
// flags 确定了写的同步/异步性
int msync(void *addr, size_t len, int flags);