系統數據庫 數據庫的訪問 sem_init sem_destroy sem_wait mlock 組數據庫的訪問 數據交換形式 同 步 內存管理 內存鎖定函數 內存映象函數 信號量特徵

系統數據庫

     組數據庫包括的信息有:組名,組的數字 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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章