POSIX標准總體分析
POSIX,全稱為可移植性操作系統接口,是一種關於信息技術的IEEE標准。它包括了系統應用程序接口(簡稱API),以及實時擴展[C語言]。
該標准的目的是定義了標准的基於UNIX操作系統的系統接口和環境來支持源代碼級的可移植性。現在,標准主要提供了依賴C語言的一系列標准服務,再將來的版本中,標准將致力於提供基於不同語言的規范。
該標准對核心需求部分定義了一系列任何編程語言都通用的服務,這一部分服務主要從其功能需求方面闡述,而非定義依賴於編程語言的接口。語言規范主要有兩部分組成。一部分包括了訪問核心服務的編程語言的標准接口,這些核心服務為標准中基於編程語言的核心需求部分所定義;另一部分包含了一個特殊語言服務的標准接口。基於任何語言,與該標准一致的執行都必須遵循語言規范的任何章節。
該標准一共被分為四個部分:
(1)陳述的范圍和一系列標准參考(第一章);
(2)定義和總概念;(第二章)
(3)各種接口設備;(第三章到第九章,第十一章到第十五章)
(4)數據交換格式;(第十章)
該標准的主要目的有:
(1)面向應用
(2)
定義接口,而不是它的具體實現;
(3)
涉及資源和可移植性,而非對象;
(4)
基於
c
語言;
(5)無超級用戶,無系統管理;
(6)
最小限度的接口,最小限度的定義;
(7)應用領域廣泛;
(8)對以前的實現進行最小限度改變;
(9)對原有程序代碼做最小的修改;
(10)
實時擴展;
以下就對各個章節做簡要分析。
第一章
概述
1.1 范圍
定義范圍的關鍵要素有:
(1)定義足夠的一套功能適用於實時應用程序領域的重要部分;
(2)定義足夠的實現規范和性能相關的函數,以便允許實時應用程序完成系統的確定性的響應;
1.2 一致性
系統須支持標准中定義的接口,系統能夠提供標准中沒有要求到的函數和工具。在遵循於該標准的實現中,一種一致性文檔是需要用到的,它必須具有與該標准相同的結構,包含有全名,數字,和標准所指示的日期,以及頭文件<limits.h>和<unistd.h>中的界限值等等。該一致性文檔詳細說明了標准中定義的執行行為。該標准要求了應用程序的一致性,所有遵循標准的應用程序都使用基於c語言的服務。
第二章術語和基本需求
2.1 定義
(1)術語
該標准中定義了一系列術語,如一致性文檔,被定義的實現,可能性,無用的特性等,還定義了一些通用名詞,如絕對路徑,存取模式,地址空間,適當權限,定時器,異步I/O操作,后台進程,后台進程組,塊文件,阻塞進程,等等。
(2)基本概念
擴展安全控制;文件存取允許;文件級別;文件名可移植性;路徑名的決定;
(3)錯誤號
大部分函數都在外部變量errno中提供了錯誤號,定義如下:
extern int errno;
(4) 簡單系統的數據類型
這些數據類型在頭文件<sys/types.h>中定義,它包含了至少以下類型:
dev_t: 用於設備號;
gid_t: 用於進程標志符;
ino_t: 用於文件序列號;
inode_t: 用於一些文件參數;
nlink_t: 用於連接內容;
off_t: 用於文件大小;
pid_t: 用於進程或進程組標志符;
size_t: 在c標准(2)中定義;
ssize_t: 用於返回字節數和錯誤標志的函數;
uid_t: 用於用戶標志符;
(4)環境描述
當一個進程開始執行時,將調用一個表示環境的字符串數組,這個數組為外部變量environ所指向,其定義如下:
extern char **environ;
(5) 其他
在該章中,標准還總體介紹了c語言定義的一些標志符,數字方面的限制,以及一些符號常量,這些在以后的章節中都會一一出現。
以下是OSE服務的簡要設計描述的一個清單。這些要求詳細敘述在POSIX規范書中。
l
進程源語
進程源語所涉及的函數完成了大多數簡單的操作系統服務,如進程處理,進程信號,以及定時器。一般情況下,該標准所確定的進程的所有屬性都不能被一個進程源語改變,除非描述符特別指明。
l
進程環境
l 目錄與文件
目錄與文件所涉及的函數執行了一系列操作系統服務,例如文件的創建和刪除,檢測,修改特性。它們提供了主要的方法,進程因為一系列 I/O操作使用他們來存取文件和目錄。
l 輸入輸出原語
這些子文件和管道函數處理輸入和輸出。功能被指定為進行文件描述符管理和I/O活動之間得平衡調節。
l 設備驅動和分類函數
該章節描述了一個基本的終端接口和一些基本的終端控制函數,如果執行時被提供,所有的異步通信端口都應該支持它,接口是支持網絡連接還是異步端口或者兩者都支持由完成者定義,一致性文檔應該描述那些設備類型被這些接口所支持。本章的一些函數主要應用與進程的控制終端
l
基於
c
語言得服務
l 系統數據庫
l 數據交換格式
l
異步
l
內存管理
l
執行調度
l
時鍾和定時器
l
消息傳遞
第三章進程原語
3.1 進程的創建和執行
1.進程創建
函數原型:pid_t fork (void)
函數功能:調用時需要引用的頭文件是<sys/types.h>,fork()創建了一個新的進程。
2.執行一個文件
函數原型:int exec1(const char *path, const char *arg, …);
int execv(const char *path, const *char argv[] );
int execle(const char *path, const char *arg, …);
int execve(const char *path, const *char argv[], char *const envp[])
int execlp(const char *file, const char *arg. …);
int execvp(const char *file, char *const argv[]);
函數功能:exec系列的函數用一個新的進程映像替代了當前的進
程映像,這個新的進程映像創建於一個規則的,可執行文件,叫做新進程映像文件。執行成功無返回值因為調用進程映像以為新的進程映像所覆蓋。
3.2 進程的終止
進程的終止有兩種情況:
(1)從main()函數返回時或者執行exit()或_exit()函數時正常的終止;
(2)被abort()函數請求或者接受到一些信號時不正常的終止;
1.等待進程終止
函數原型:#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid,int *stat_loc.int options);
函數功能:wait()和waitpid()允許調用進程獲得它的一個子進程的狀態信息。Wait()函數將掛起調用進程直到獲得了它的子進程的狀態信息,或者是直到獲得一個終止進程信號;如果pid=-1並且options=0,waitpid()函數功能將和waitpid()相同,否則它的功能將依據pid和options的值而改變。
2. 終止一個進程
函數原型:void_exit(int status);
函數功能:_exit()函數將終止一個調用進程,該函數不能返回給其調用者
3.3 信號
在頭文件<signal.h>終聲明了sigset_t類型和sigaction結構。完成所定義的信號分三類:必需的信號;任務控制信號;內存保護信號,分別如下表:
必需信號
符號常量 |
描述
|
SIGABRT | 非正常終止信號 |
SIGALRM | 超時信號 |
SIGFPE | 錯誤運算操作 |
SIGHUP | 為控制中斷所檢測到的掛斷 |
SIGILL | 無效硬件信號的檢測 |
SIGINT | 交互式信號 |
SIGKILL | 終止信號 |
SIGPIPE | 寫信號 |
SIGQUIT | 交互式終止信號 |
SIGSEGV | 無效內存引用檢測信號 |
SIGTERM | 終止信號 |
SIGUSR1 | 保留信號 |
SIGUSR2 | 保留信號 |
作業控制信號
符號常量 |
描述
|
SIGCHLD | 子進程終止或停止 |
SIGCONT | 停止后繼續 |
SIGSTOP | 停止信號 |
SIGTSTP | 交互式的停止信號 |
SIGTTIN | 從控制終端讀 |
SIGTTOU | 寫到控制終端 |
內存保護信號
符號常量 |
描述
|
SIGBUS | 獲取內存中不確定的部分 |
每一個進程有一個進程標記(process mask),它定義了一組產生但被阻塞傳遞的信號集。Sigaction(),sigpromask(),sigsuspend()
函數控制這個進程標記的行為。
1.送一個信號到進程
函數原型:#include <sys/types.h>
#include<signal.h>
int kill(pid_t pid, int sig)
函數功能:該函數發送一個信號到一個由pid指明的進程或者進程組,sig標志了信號類型,其值是0或者上表中的值。如果發送成功,返回‘0’,否則返回‘1’。
2. 操縱信號集
函數原型:#include<signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigisemeber(const sigset_t *set,int signo);
函數功能:sigsetops源語操縱信號集。他們操作以數字為對象,這些數據由應用程序的地址所指向,而不是以系統所知的信號集為對象。
3. 檢測和更改信號的行為
函數原型:#include<signal.h>
int sigaction(int sig,const struct sigaction *act,struct sigaction *oact);
函數功能:該函數允許調用函數檢查與確定的信號相聯系的行為,
參數sig確定了信號,sigaction結構在頭文件<signal.h>中被定義,描述了所采取的行為。如果參數act不為null,它指向一個結構,它指定了與信號相聯系的行為。如果參數oact不為null,先前與信號相聯系的行為將被存儲到由oact指向的地方。
4. 檢查和改變阻塞信號
函數原型:#include<signal.h>
int sigprocmask(int how,xonst sigset_t *set,sigset_t *oset);
函數功能:該函數用來檢查和改變調用進程的信號標記(signal mask),如果參數set不為null,它指向一個信號集的用於改變當前的阻塞集。參數how指明了改變方式,參數oset不為null時,先前的信號標記被存儲在它所指向的地方,如果參數set為null,則參數how就沒有意義了,而且進程的信號標記不能隨函數調用而改變。
5. 檢查未定的信號
函數原型:#include<signal.h>
int sigpending(sigset_t *set);
函數功能:該函數存儲一個信號集,這些信號是在被調用進程傳輸和未定的情況下阻塞的,由參數set所指向。
6.等待一個信號
函數原型:#include<signal.h>
int sigsuspend(const sigset_t *sigmask);
函數功能:該函數用參數sigmask所指向的信號集取代了進程信號標記(signal mask),然后掛起該進程直到接受到一個信號,其行為是執行信號跟蹤功能或者是終止該進程。
7. 同步接受一個信號
函數原型: #include<signal.h>
int sigwaitinfo(const sigset_t *set, siginfo_t *info);
int sigtimedwait(const sigset_t *set,siginfo_ *info, const struct timespec *timeout );
函數功能:該函數從參數set所確定的信號集中選擇一個未定的信號出來。如果該函數成功,返回一個信號數;否則返回-1。
8. 排隊一個信號到進程
函數原型:#include<signal.h>
int sigqueue(pid_t pid,int signo, const union sigval value);
函數功能:該函數功能是使由signo確定的信號將參數value所確定的值發送到由pid指明的進程中去。
3.4 定時器操作
1.調度警報
函數原型:unsigned int alarm(unsigned int seconds);
函數功能:當參數seconds指定的一段實時時間過去后,該函數將發送一個SIGALRM信號到調用進程。
2. 掛起進程的執行
函數原型:int pause(void);
函數功能:該函數掛起一個調用進程直到得到一個信號,這個信號或者執行信號跟蹤功能或者是終止該進程。如果是終止進程,該函數不返回;如果是執行信號跟蹤功能,則該函數在信號跟蹤函數返回后也要返回。
3. 延遲進程的執行
函數原型:unsigned int sleep(unsigned int seconds);
函數功能:該函數使當前進程從執行狀態轉化為掛起狀態,直到參數seconds所指定的一段實時時間過去后,或者是一個喚醒信號跟蹤功能或終止進程功能的信號到來。該掛起時間由於系統的其他調度活動可能會比要求的時間長。
第三章進程環境
4.1 進程標志符
1.獲得進程和父進程的ID
函數原型:#include<sys/types.h>
pid_t getpid(void);
pid_t getppid(void);
函數功能:getpid()返回調用進程的進程ID,
getppid()返回調用進程的父進程ID.
4.2 用戶ID
1.獲得真實用戶,有效用戶,真是組,有效組的ID
函數原型:#include<sys/types.h>
uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid(void);
gid_t getegid(void);
函數功能:getuid()返回調用進程的真實用戶ID, geteuid()返回調用進程的有效用戶ID,getgid()返回調用進程的真實組ID,getegid()返回調用進程的有效組的ID。
2. 設置用戶和組的ID
函數原型:#include<sys/types.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
函數功能:這兩個函數分別根據進程的權限設置真實用戶ID,有效用戶ID,真實組ID,有效組ID。
3. 獲得輔助組ID
函數原型:# include<sys/types.h>
int getgroups(int gidsetsize.gid_t grouplist[]);
函數功能:該函數在隊列的組列表中填入調用進程的輔助組ID。參數grouplist確定了組列表中的元素個數。
4. 獲得用戶名
函數原型:char *getlogin(void)
函數功能:該函數返回一個指針,指向與調用進程相關的用戶名。
4.3 進程組
1.獲得進程組ID
函數原型:#include<sys/types.h>
pid_t getpgrp(void);
函數功能:該函數返回調用進程的進程組ID。
2. 創建會議並且設置進程組ID
函數原型:#include<sys/types.h>
pid_t setsid(void)
函數功能:如果調用進程不是進程組的引導者,則該函數將創建一個新的會議。該調用進程應該為新會議的會議引導者,應該為新進程組的引導,應該沒有控制終端。進程組的ID應該等於該調用進程的ID。
3. 為作業控制設置進程組ID
函數原型:#include<sys/types.h>
int setpgid(pid_t pid,pid_t pgid);
函數功能:如{_POSIX_JOB_CONTROL}被定義,則該函數用來加入已經存在的進程組或者創建一個新的進程組。
4.4 系統標志
1.獲得系統名
函數原型:#include<sys/utaname.h>
int uname(struct utsname *name);
函數功能:該函數存儲了鑒別當前操作系統的信息。
4.5 時間
1得到系統時間
函數原型:#include<time.h>
time_t time(time_t *tloc);
函數功能:該函數返回自從一時間點以來的某個時間值,以秒為單位。參數tloc指向一個時間值所存儲的地方。
2. 獲得進程時間
函數原型:#include<sys/times.h>
clock_t times(struct time *buffer);
函數功能:參數buffer指向一個結構,該函數向該結構填寫有關時間的信息。Clock_t和tms結構在<sys/times.h>中定義。
4.6 環境變量
1.獲取環境
函數原型:#include<stdlib.h>
char *getenv(const char *name);
函數功能:該函數在環境列表查找字符串name=value,返回指向value的指針。如果沒有找到,則返回null。
4.7 終端標志
1.產生終端路徑
函數原型:#include<stdio.h>
char Ictermid(char *s);
函數功能:該函數產生一個字符串,作為路徑名,提交到當前進程的當前控制終端。
2.確定終端設備名
函數原型:char *ttyname(int fildes);
int isatty(int fildes);
函數功能:ttyname()返回一個指針指向一個字符串,它包含了與文件描述符fildes相關的終端名;如果fildes是一個有效的與終端聯系的文件描述符,isatty()返回“1”,否則返回“0”。
4.8 可配置的系統變量
1.獲得可配置的系統變量
函數原型:#include<unistd.h>
long sysconf(int name);
函數功能:該函數提供了一個應用方法來決定可配置系統變量的當前值。參數name代表了所查詢的系統變量。
第五章文件和目錄
5.1 目錄
1.目錄的入口形式
頭文件<dirent.h>定義了一個結構和目錄程序用到的類型,沒有確定的文件內部格式。Readdir()返回了一個指針指向一個類型對象struct dirent。
2.目錄操作
函數原型:#include<sys/types.h>
#include<dirent.h>
dir *opendir(const char *dirname);
struct dirent *readdir(dir *dirp);
void rewinddir(dir *dirp);
int closedir(dir *dirp);
函數功能:opendir()根據參數dirname打開一個目錄流;readdir()返回一個指針,它指向一個目錄流中當前位置的目錄入口,目錄流由參數dirp指向;rewinddir()重置目錄流的位置到目錄的起點;closedir()關閉目錄流,如成功,則返回“0”值。
5.2 工作目錄
1 改變當前的工作目錄
函數原型:int chdir(const char *path);
函數功能:path指向目錄的路徑名。該函數使命名的目錄成為當前的工作目錄。
2 獲得工作目錄路徑名
函數原型:char *getcwd(char *buf,size_t size);
函數功能:該函數復制當前工作目錄的絕對路徑名到buf所指向的隊列中。
5.3 基本文件的創建
1 打開一個文件
函數原型:#include<sys/types.h>
#include<sys/stat.h>
#include<fcnt1.h>
int open(const char *path, int oflag,…);
函數功能:open()在文件和文件描述符之間建立了一個連接,它創建了一個指向一個文件的打開文件描述,參數path指向文件的路徑名。
2 創建一個新文件或者重寫一個已經存在的文件
函數原型:#include<sys/types.h>
#include<sys/stat.h>
#include<fcnt1.h>
int creat(const char *path, mode_t mode);
函數功能:該函數調用creat(path,mode)相當於open(path,o_wronly/o_creat/o_trunc,mode);
3 設置文件的創建標記
函數原型:#include<sys/types.h>
#include<sys/stat.h>
mode_t umask(mode_t cmask);
函數原型:umask()設置進程的文件模式創建標記到cmask,並且返回原來的標記值。
4 連接到一個文件
函數原型:int link(const char *existing,const char *new);
函數功能:參數existing指向路徑名來命名存在文件,參數new指向一個路徑名,它命名了一個創建的新的目錄入口。該函數為已存在的文件自動的創建一個新的連接,並且將文件連接數加1。
5.4 特殊文件創建
1 生成一個目錄
函數原型:#include<sys/types.h>
#include<sys/stat.h>
int mkdir(const char *path,mode_t mode);
函數功能:該函數依據參數path創建一個新的目錄。新目錄的允許位根據mode初始化。
2 創建一個FIFO類型的文件
函數原型:#include<sys/types.h>
#includesys/stat.h>
int mkfifo(const char *path,mode_t mode);
函數功能:mkfifo()創建一個新的fifo類型文件,它由path指向的路徑名命名。
5.5 文件的移動
1 移動目錄入口
函數原型:int unlink(const char *path);
函數功能:該函數移去由參數path指向得路徑名所命名得連接並將連接數減去1。
2 移去一個目錄
函數原型:int rmdir(const char *path)
函數功能:
3 重命名一個文件
函數原型:int rename(const char *old,const char *new);
函數功能:該函數改變一個文件的名字,參數old指向被重命名文件的路徑名,參數new指向文件的新路徑名。
5.6 文件特征
5.7 可配置路徑名變量
第六章
輸入與輸出源語
6.1 管道
1 創建內進程通道
函數原型:int pipe(int filedw[2]);
函數功能:該函數創建一個管道並且創建兩個文件描述符,一個是fildes[0],一個是fildes[1],它們分別指的是‘讀’與‘寫’的管道端。
6.2 文件描述符控制
1 復制一個打開文件描述符
函數原型:int dup(int fildes);
int dup2(int fileds,int fileds2);
函數功能:這兩個函數為fcntl()服務提供了兩個選擇的接口,用到了F_DUPFD命令。
6.3 撤除文件描述符
1 關閉一個文件
函數原型:int close (int fildes);
函數功能
6.4 輸入和輸出
1 文件讀
函數原型:ssize_t read(int fildes,void *buf,size_t nbyte);
函數功能:
2 文件寫
函數原型:ssize_t write(int fildes,const void *buf,size_t nbyte);
函數功能:
6.5 一個文件的控制操作
1 文件控制操作的數據定義
頭文件<fcnt1.h>為fcntl()和open()定義了一下的要求和參數:
fcntl()的_cmd值
常量
|
描述
|
F_DUPFD | |
F_GETFD | |
F_GETLK | |
F_SETFD | |
F_GETTFL | |
F_SETFL | |
F_SETLK | |
F_SETLKW |
2 文件控制
函數原型:#clude <sys/types.h>
#clued<unistd.h>
#include<fcntl.h>
int fcntl(int fildes,int cnd,…);
函數功能:fcntl()為打開的文件提供了一系列控制,參數fildes是一個文件描述符。Cmd決定了控制的內容。
3 讀/寫文件偏移量的重新定位
函數原型:#include<sys/types.h>
#include<unistd.h>
off_t lseek(int fildes,off_t offset,int whence);
函數功能:lseek()為fildes所指定的文件重新設置偏移量。
6.6 文件同步
1 文件的狀態同步
函數原型:#include<unistd.h>
int fsync(int fildes);
函數功能:該函數用來暗示所有的文件描述數據被傳輸到了存儲設備上。
2 文件數據的同步
函數原型:#include<unistd.h>
int fdatasync(int fildes);
函數功能:該函數迫使當前所有排隊的I/O操作進入同步 I/O狀態。
6.7 異步輸入與輸出
1 ●異步輸入與輸出的數據定義
頭文件<aio.h>能使<sys/types.h>,<signal.h>,<time.h>
和<fcntl.h>中的符號可見。
● 異步I/O控制塊
異步I/O控制塊結構aiocb在許多異步I/O接口中使用,它在<aio.h>中定義。
●主要常量
2 異步讀
函數原型:#include<aio.h>
int aio_read (struct aiocb *aiocbp);
函數功能:aiocbp->io_nbytes,表示讀的字節數;aiocbp->aio_fildes,表示讀的文件;aiocbp->aio_buf,表示讀到的緩沖區。
3 異步寫
函數原型:#include<aio.h>
int aio_write(struct aiocb *aiocbp);
函數功能:參數表示同上。
4 列出直接I/O
函數原型:#include<aio.h>
int lio_listio(int mode,struct aiocb *const list[],int nent,struct sigevent *sig);
函數功能:該函數允許用一個函數調用初始化一個I/O請求
列表。
5 得到異步I/O操作的錯誤狀態
函數原型:#include<aio.h>
int aio_error(const struct aiocb *aiocbp);
函數功能:該函數返回aiocbp指向的結構所表示的錯誤狀態。
6 得到異步I/O操作的返回狀態
函數原型:#include<aio.h>
ssize_t aio_return(struct aiocb *aiocbp);
函數功能:
7 刪除異步I/O請求
函數原型:#include<aio.h>
int aio_cancel (int fildes,struct aiocb *aiocbp);
函數功能:參數fildes是文件描述符,參數aiocbp指向異步I/O控制塊上的請求刪除部分。
8 等待異步I/O請求
函數原型:#include<aio.h>
int aio_suspend(const struct aiocb *const list[],int nent,const struct timespec *timeout);
函數功能:標准定義該函數掛起調用進程直到至少一個list指向
的異步I/O操作完成,或者一個信號中斷了一個函數,
或者超時了(timeout指定)。
9 異步文件同步化
函數原型:#include<aio.h>
int aio_fsync(int op,struct aiocb *aiocbp);
函數功能:該函數迫使所有與(參數aiocbp指向的)結構aiocb中aio_fildes所指定的文件相關異步I/O操作進入同步狀態。
第七章
設備和面向類的函數
7.1 基本的終端接口
1 接口特性
●當一個終端文件被打開,通常它將引起進程等待直到連接被建立。
●進程組
一個終端可以具有與它相關的前台進程組,它發揮特定的角色,后面會講到。
● 控制終端
● 終端存取控制
● 輸入操作和讀進程
● 規范的輸入操作
● 非規范模式的輸入操作
● 寫數據和輸出處理
● 特殊的符號(INTR,QUIT,ERASE,KILL…)
● modem斷掉連接
● 關閉終端設備文件
2 可設置的參數
●termios機構
該結構在<termios.h>中定義,在控制特定的終端I/O特性中要用到。
●輸入模式
termios c_iflap值域
標記名 | 描述 |
BRKINT |
信號中斷
|
ICRNL | 輸入時將CR映射到NL |
IGNBRK |
忽略中斷狀態
|
IGNCR | 忽略CR |
IGNPAR |
忽略奇偶錯誤
|
INLCR |
輸入時將NL映射到CR
|
INPCK |
輸入奇偶校驗使能
|
ISTRIP |
Strip字符
|
IXOFF | 開始/停止輸入控制使能 |
IXON | 開始/停止輸出控制使能 |
PARMRK | 產生奇偶錯誤 |
●輸出模式
●控制模式
標記名 |
描述
|
CLOCAL | 忽略modem狀態行 |
CREAD | 接受使能 |
CSIZE | 每個字節的位數 |
CS5 |
5位
|
CS6 |
6位
|
CS7 |
7位
|
CS8 | 8位 |
CSTOPB | 發送一個或兩個停止位 |
HUPCL | 在最后的關閉中掛起 |
PARENB | 奇校驗使能 |
PARODD |
奇校驗或偶校驗
|
●本地模式
termios c_lflag 值
標記名 |
描述
|
ECHO |
響應使能
|
ECHOE |
響應ETASE
|
ECHOK |
響應KILL
|
ECHONL |
響應’/n’
|
ICANON |
規范輸入
|
IEXTEN |
擴展函數使能
|
ISIG |
信號使能
|
NOFLSH |
中斷,停止或掛起后關掉flush
|
TOSTOP |
為后台輸出發送SIGTTOU
|
●特殊的控制字符
這些特殊的控制字符值在隊列c_cc中定義,分為規范和非規范兩種模式。
●波特率值
3 波特率函數
函數原型:#include<termios.h>
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetospeed (struct termios *termios_p,speed_t speed);
speed_t cfgetispeed(const struct termios *termios_p);
int cfsetispeed(struct termios *termios_p,speed_t speed);
函數功能:以上這些接口被用來在termios結構獲得和設定輸入與輸出的波特率值。
7.2 基本的終端接口控制函數
1 獲得並設定狀態
函數原型:#include<termios.h>
int tcgetattr(int fildes,struct termios *termios_p);
int tcsetattr(int fildes,int optional_actions,const struct termios * termios_p);
函數功能:tcgetattr()獲得fildes所確定的文件的參數並將其存儲在t’erops_p所指向的結構中;tcsetattr()將設置參數。
2 行控制函數
函數原型:#include<termios.h>
int tcsendbreak(int fildes,int duration);
int tcdrain(int fildes);
int tcflush(int fildes,int queue_selector);
int tcflow(int fildes,int action)’
函數功能:如果終端使用異步連續數據傳輸,tcsendbreak()引起在一段時間內連續的‘0’位傳輸;tcdrain()等待直到輸出傳輸完畢;tcflush()和tcflow()是溢出的相關處理。(參考第212頁)
3取得前台進程組的ID
函數原型:#include<sys/types.h>
pid_t tgetpgrp(int fildes);
功能:
4 設置前台進程組ID
函數原型:#include<sys/types.h>
int tcsetpgrp(int fildes,pid_t pgrp_id);
功能:如果進程支持控制終端,該函數設置與終端相關的前台進程組ID到pgrp_id。
第八章
基於
C
語言的服務
8.1 參考的C語言規范
1 時間函數的擴展
2 setlocale()函數的擴展
函數原型:#include<locale.h>
char *setlocale(int category,const char *locale);
函數功能:該函數根據參數category和locale設置,更改或者查詢進程現場。
8.2 C語言輸入/輸出函數
1 映射一個流指針到一個文件描述符
函數原型:#include<stdio.h>
函數功能:該函數返回一個與流相關的整型文件描述符。
2 根據一個文件描述符打開一個流
函數原型:#include<stdio.h>
FILE *fdopen(int fildes,const char *type);
函數功能:該函數聯合一個流和一個文件描述符。
3 其他文件類型函數之間的相互作用
一個單一的文件描述說明可以通過流和文件描述符訪問,流
或者是文件描述符被稱作位打開文件的句柄,一個打開文件說明
可以有多個句柄。句柄可以在不影響重要的打開文件說明的情況
下被創建和刪除,創建如fcntl().dup(),fdopen(),fileno(),fork();刪除
如fclose(),close()。
(1)fopen()隨着open()的調用分配描述符,基礎函數為
open()。
(2)fclose():該函數完成在與FILE流相關的,對文件描述符的close()功能。
(3)freopen():具有fclose()和fopen()的特點。
(4)fflush():如果流可寫或者緩存數據還沒有寫入文件時,
該函數標記下基礎文件st_ctime和st_mtime的
值。
(5)fgetc(),fgets(),fread(),getc(),getchar(),gets
(),scanf(),fscanf():這些函數標記更新的st_atime值。
基礎函數是read()和lseek()。
(6)fputc(),fputs(),fwrite(),putc(),putchar(),puts(),printf(),fprintf():
從以上任一個函數的成功執行到下一個調用(在同一個流中的fflush()或fclose()或exit()或abort()),記下 更新的st_ctime和st_mtime值。基礎函數是write()和
lseek()。
(7) fseek(),rewind():如果流可寫或者緩存數據還沒有寫
入文件時,該函數標記下文件更新的st_ctime和st_mtime值。基礎函數是
lseek()和write()。
(8) perror():記下與標准錯誤流相關的文件。
(9) tmpfile():fopen()執行后為文件分配文件描述符。
(10) ftell(): 基礎文件是lseek()。執行fflush()后執行該
函數的結果與執行fflush前執行該函數的結果相同。
(11) 報錯
(12) exit(),abort():exit()終止進程的時候要關閉流,
abort()只終止進程對流沒有影響。
4 文件操作-----remove()函數
該函數和unlink()函數的功能一樣。
8.3 其他的C函數
1 非局部跳轉
函數原型:#include<setjmp.h>
int sigsetjmp(sigjmp_buf env,int savemask);
void siglongjmp(sigjmp_buf env,int val);
函數功能:sigsetjmp()宏要與標准中setjmp()宏的定義一致,如果參數savemask不為“0”,sigsetjmp()就要保存當前的信號標記作為調用環境的一部分。Siglongjmp()同理。
2 設置時間域
函數原型:#include<time.h>
void tzset(void);
函數功能:該函數用環境變量TZ的值來設定時間變化信息。
第九章
系統數據庫
9.1 系統數據庫
本章描述了兩個數據庫:組數據庫和用戶數據庫。
組數據庫包括的信息有:組名,組的數字ID,組中的用戶列表;
用戶數據庫包含的信息有:用戶名,用戶的數字ID,組的數字ID,初始化的工作目錄,和初始化的用戶程序。
9.2 數據庫的訪問
1 組數據庫的訪問
函數原型:#include<sys/type.h>
#include<grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
函數功能:getgrid()和getgrnam()返回指針,它指向一個struct
group類型的對象,包含了組數據庫的入口。
2 用戶數據庫的訪問
函數原型:#include<sys/types.h>
#include <pwd.h>
struct paswd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);
函數功能:getpwuid()和getpwnam返回一個指針,指向struct
passwd類型的一個對象,它包含了用戶數據庫的入
口。
第十章
數據交換形式
10.1 歸檔/交換文件格式
1 擴展的tar格式
2 擴展的cpio格式:面向字節的歸檔格式,包括了文件頭,文件名和文件內容。
3 大流量:該格式被看作是字節流。
第十一章
同
步
11.1 信號量特征
頭文件<semaphore.h>定義了sem_t類型,它用於信號量操作中。sem_t代表了信號量,用文件描述符能夠實現這些信號量,應用程序能夠打開至少{OPEN_MAX}這么多的文件和信號量。標准中,頭文件<semaphore.h>能使頭文件<sys/types.h>和<fcntl.h>中的符號可見。
11.2 信號量函數
1 初始化一個未命名的信號量
函數原型:#inxlude<semaphore.h>
int sem_init (sem_t *sem,int pshared,unsigned int value);
函數功能:如果{_POSIX_SEMAPHORES}定義了:該函數被用
來初始化sem引用的未命名信號量。在成功調用該函
數以后,在接下來的sem_wait(),sem_trywait(),sem_post(),sem_destroy()的調用中,該信號量將被用到。如果參數pshared不為零,信號量將在進程中被共享,任何可以訪問信號量sem的進程都可以使用sem。只有sem能被用來進行同步。如果參數pshared為零,則結構不確定。如果標准中未定義,可以由執行者來支持該函數。
2刪除一個未命名信號量
函數原型:#include <semaphore.h>
int sem_destroy(sem_t *sem);
函數功能:如果{_POSIX_SEMAPHORES}定義了,該函數用來刪除sem引用的未命名信號量,只有在sem_init()中創建的信號量才能被該函數刪除。
3 初始化/打開一個命名信號量
函數原型:#include<semaphore.h>
sem_t *sem_open(const char *name,int oflag,…);
函數功能:如果{_POSIX_SEMAPHORES}定義了,該函數在進程和命名信號量之間創建一個鏈接。接着調用帶有信號量名name的該函數,進程引用與name相關的信號量。該信號量在一些函數的調用中用到,如sem_wait(),sem_trywait(),sem_post,和sem_close()。信號量一直可用知道調用函數sem_close(),_exit,exec()關閉它。參數oflag控制是否信號量由sem_open()創建或者僅被它訪問。
4 關閉一個命名信號量
函數原型:#include<semphore.h>
int sem_close(sem_t *sem);
函數功能:如果{_POSIX_SEMAPHORES}定義了,該函數用來提示調用進程已經完成使用sem所指明的信號量。該函數釋放系統資源,這些資源被擁有該信號量的進程占有。
5 移走一個命名信號量
函數原型:#include<semaphore.h>
int sem_unlink(const char *name);
函數功能:該函數將移走被字符串name命名的信號量。如果該信號量當前被其他進程引用,則該函數對信號量狀態沒有影響。如果一個和更多的進程打開了該信號量,則銷毀該信號量被延遲知道所有的信號量被sem_close(),_exit(),exec關閉。
6 鎖定一個信號量
函數原型:#include<semaphore.h>
int sem_wait (sem_t*sem);
int sem_trywait(sem_t *sem);
函數功能:sem_wait()鎖定sem引用的一個信號量,對該信號進行鎖定操作。如果信號量為“0”,調用進程將不會返回直到鎖定了這個信號量或者被一個信號中斷。Sem_trywait()只能在信號量當前沒被鎖定的情況下鎖定它,否則將不會鎖定信號量。成功返回,信號量的狀態將被鎖定直到sem_post()被調用並且成功返回。
7 解鎖一個信號量
函數原型:#include<semaphore.h>
int sem_post(sem_t *sem);
函數功能:該函數通過對一個信號量的解鎖操作解鎖一個被sem引用的信號量。如果該操作的結果,信號量值為正數,則沒有進程被鎖定來等待一個信號量解鎖,信號量值是單一的增加。如果信號量值為“0”,則進程被鎖定來等待一個信號量被允許從sem_wait()成功返回。
8 取得一個信號量值
函數原型:#include<semaphore.h>
int sem_getvalue(sem_t *sem,int *sval);
函數功能:該函數更新參數sval所引用的位置,在不改變信號量狀態的情況下得到信號量值。更新的值代表了一個確切的值,它產生在調用中的一個不定時刻,但它返回給調用進程是不一定需要信號量的確定值。如果sem被鎖定,則sem_getvalue()返回的值為0,或者負數,它代表了等待信號量的進程數。
第十二章
內存管理
該章節描述了進程內存鎖定,內存映象文件,和共享內存工具。
內存鎖定和內存映象文件以頁的方式定義。執行者可以據據頁大小的規范限制和排列鎖定和映象范圍。頁的大小,以字節為單位,是一個可配置系統變量。默認為1B。
內存鎖定保證了一部分地址空間的駐留。
12.1 內存鎖定函數
1 鎖定/解鎖進程地址空間
函數原型:#include<sys/mman.h>
int mlockall(int flags);
int munlockall(void);
函數功能:mlockall()使進程地址空間所映射的所有頁面成為內存駐留區,直到解鎖或者進程退出或者execs另一個進程映象。參數flags決定了是否被鎖定的頁面是由當前,(將來,或者兩者都是)的進程地址空間映射的。Munlockall()解鎖當前所有的進程地址空間映射頁面。所有映射到進程地址空間的頁面,調用了該函數,將不會被鎖定,除非有中斷調用mlockall()確定MCL_CURRENT,或者並發調用mlockall()確定MCL_CURRENT。
2 鎖定/解鎖一連續的地址空間
函數原型:#include<sys/mman.h>
int mlock(const void *addr,size_t len);
int munlock(const void *addr,size_t len);
函數功能:mlock()使一個范圍的進程地址空間成為內存駐留
區(addr決定了空間的起始地址,len決定了空間長
度)直到解鎖或者進程退出或者execs另一個進程映
象;munlock()解鎖一個范圍的進程地址空間(addr
決定了空間的起始地址,len決定了空間長度);
12.2 內存映象函數
1 映象進程地址到一個內存目標
函數映象:#include<sys/mman.h>
void *mmap(void *addr,size_t len,int prot,int flags,int fildes,off_t off);
函數功:該函數在一個進程的地址空間和內存對象間創建一個映
射,調用格式如:pa=mmap(addr,len,prot,flags,fildes,off);
pa代表進程進程地址空間的地址,由執行者定義(addr
和flags),len表示空間長度,fildes代表內存對象,off
表示偏移量。函數成功調用返回pa,空間地址范開始
與pa,長度為連續的len個字節;內存對象開始與off,
長度為len字節。參數prot決定了讀,寫,執行,或一
些映射數據的訪問活動的集合。
2 取消以前映射地址的映射關系
函數原型:#include<sys/mman.h>
int munmap(void *addr,size_t len);
函數功能:該函數移去任何包含有進程地址空間的頁面的映射關
系,該進程地址空間起始於addr,長度為len字節。
3 改變內存保護
函數原型:#include <sys/mman.h>
int mprotet(const void *addr,size_t len,int prot);
函數功能:該函數更改訪問的保護活動,由參數prot確定。訪問對象是一部分進程地址空間,起始於addr,長度為len字節。
4 內存對象同步
函數原型:#inxlude<sys/mman.h>
int msync(void *addr,size_t len,int flags);
函數功能:該函數將所有更改了的數據寫到擁有存儲的地方,它包含了進程地址空間,起始於addr,長度為len字節。如果沒有這樣的存儲區域存在,則給函數沒有作用。該函數須保證寫操作的完成符合所定義的同步I/O數據的一致完成性。參數flags確定了寫的同步/異步性。
12.3 共享內存函數
1 打開一個共享內存對象
函數原型:include<sys/mman.h>
int shm_open(const *name,int oflag,mode_t mode);
函數功能:該函數在共享內存對象和文件描述符之間創建了一個連接。它創建了一個打開文件描述涉及到共享內存對象,並且創建了一個文件描述符指向這個打開文件描述。這個文件描述符可悲其他函數用來指向共享內存對象,參數name指向共享內存對象名。如函數調用成功,則返回一個共享內存的文件。文件狀態和文件訪問模式根據oflag的值來設定。
2 移去一個共享內存對象
函數原型:int shm_unlink(const char *name);
函數功能:該函數移去由name命名的共享內存對象。如果一個或者多個對共內存的引用在對象斷開連接的同時退出的話,這個名字應在shim_unlink()返回之前移走,但是對內存對象的移走須延遲到所有對共享內存對打開和映射引用被移去后。
十三章
執行調度
13.1 調度參數
一個調度參數結構sched_param包括了調度策略所支持的執行者
所需要的調度參數,它在頭文件<sched.h>中定義。執行者可根據規
對該結構進行擴展。
13.2 調度策略
該章所闡述的調度術語是從概念模型上定義的,它包含了一組進程列表。這個模型只討論了可運行進程的處理器調度,但是它注重了在其他資源考慮到處理器調度策略的情況下,增強了實時操作的可預見性。在這里,概念上講是一個進程列表一個策略。調度策略的目的就是對這一組列表定義允許的操作(例如,在進程列表之中和之間移動進程)。每一個進程應由相關的調度策略和優先級,於每一個策略相關的是一個優先級范圍。
1 SCHED_FIFO
該策略是一種先進先出的調度策略。如果正在執行的進程是被搶占的進程,則他應該在進程列表頭;如果一個鎖定的進程變成可執行進程,它就進入進程列表尾;當執行進程調用sched_setscheduler(),則函數中確定的進程被改為指定的策略;當執行進程調用sced_setparam(),進程的優先級根據參數param被修改,如果改進程是正在執行和可執行,則它將進入進程列表尾;當正在執行的進程調用seced_yield(),進程進入列表尾。
2 SCHED_RR
該策略與上面的策略不同的是,如果執行中檢測到進程的執行時間已經到達或超過了sched_rr_get_interval()所返回的時間片,進程就進入列表尾並且進程列表頭移動一個進程進入執行狀態。
3 SCHED_OTHER
13.3 進程調度函數
1 設置調度參數
函數原型:#include<sched.h>
int sched_setparam(pid_t pid,const struct sched_param *param);
函數功能:pid指明了進程,param指向了sched_param結構,該結構設定了進程的調度參數。如果pid=0,調度參數為調用進程設定。如果pid指定的進程的優先級高於正在指向的進程並且該進程可執行,則搶占現在正在運行的進程。如果當前的策略不是前面將的三種方式,則由執行者定義。
2 取得調度參數
函數原型:#include<sched.h>
int sched_getparam(pid_t,struct sched_param *param);
函數功能:該函數返回調度參數,如果一個pid進程退出並且調用進程允許,則ID等於pid的進程返回其調用參數。如果pid=0,則返回調用進程的調度參數。
3 設置調度策略和調度參數
函數原型:#include<sched.h>
int sched_setscheduler(pid_t pid,int policy,const struct sched_param *param);
函數功能:該函數設置進程的調度策略和調度參數,pid表示進程,policy指明策略,參數param指向的sched_param結構指明了調度參數。執行者可要求請求進程能允許設定自己或其他進程的調度參數。
4 取得調度策略
函數原型:#include<sched.h>
int sched_getscheduler(pid_t pid);
函數功能:該函數返回pid進程的調度策略,其返回值在頭文件<sched.h>中定義。
5 放棄處理器
函數原型:#include<sched.h>
int sched_yield(void);
函數功能:該函數迫使正在執行進程放棄處理器直到重新進入進程列表頭。
6 獲得調度參數范圍
函數原型:#incude<sched.h>
int sched_get_priority_max(int policy);
int sched get_priority min(int policy);
int sched_rr_get_interval(pid_t pid,struct timespec *interval);
函數功能:sched_get_priority_max()和sched_get_priority_min()返
回policy調度策略相應的最大最小值。Sched_rr_get
_interval()更新interval參數引用的timespec結構,包
含了當前進程執行的時間限制。
第十四章
時鍾和定時器
14.1 時鍾和定時器的數據定義
頭文件<time.h>定義了時間設備用到的類型和主要常量。
1 時間值的規格結構
一個時間值結構timespec確定了單一時間值並且包括了以下值:
成員類型 | 成員名 | 描述 |
time_t | tv_sec | seconds |
long | tv_nsec | nanosenconds |
執行者可對他做擴展,tv_nsed成員要大於等於零時才可用。
時間值結構itimerspec確定了一個初始化的定時器和各進程定時器函數用到的重復間隔。結構包括:
成員類型 | 成員名 | 描述 |
Struct timespec | It_interval | Timer period |
Struct timespec | It_value | Timer expiration |
執行者也可以對其做擴展。
2 定時器活動喚醒控制塊
為了使完成支持實時信號擴展功能,各進程定時器被創建通過排列實時擴展信號來通知定時器超時的進程。Sigevent結構在頭文件<signal.h>中定義,用來創建一個這樣的定時器。
3 類型定義
在<sys/types.h>中定義。
4 主要常量
在<time.h>中定義:
CLOCK_REALTIME 系統范圍的實時時鍾標志
TIMER_ABSTIME flag指定的時間對於時鍾是“完全”的
14.2 時鍾和定時器函數
1 時鍾
函數原型:#include<time.h>
int clock_settime(clockid_t clock_id,const struct timespec *tp);
int coock_gettime(clockid_t clock_id,struct timespec*tp);
int clock_getres(clockid_t clock_id,struct timespec *res);
函數功能:clock_settime()設置特定時鍾,clock_id,到tp指定的值。
Clock_gettime()返回當前的tp值,即時鍾,clock_id;
調用clock_getres()可以得到時鍾的決定值,該值由執行
者定義而不由進程設定。如果res不為空,則該值被存
儲在res指向的地方,如果res為空,則時鍾決定值不
被返回。一個時鍾可以是系統范圍的,對於所以的進程可見,所有的執行者要支持CLOCK_REALTIME的clock_id。對於這個時鍾。Clock_gettime()返回的和clock_settime()確定的值代表了從一個時間點開始的時間長度,執行者也可以支持附加的時鍾。借助clock_settime()設定時鍾的影響由執行者定義。設置特殊時鍾的權限也有執行者定義。
2 創建一個總進程定時器
函數原型:#include<signal>
#include<time.h>
int timer_create(clockid_t clock_id,struct sigevent
*evp,timer_t *timerid);
函數功能:timer_create()創建一個總進程定時器,用來指明時鍾,clock_id,作為計時基礎。該函數在timerid指向的地方返回一個timer_t類型的定時器ID,該ID在調用進程中必須是唯一的直到定時器被刪除。參數evp如果不為空,則指向一個sigevent結構,定義了定時器超時時出現的異步通知。結構中sigev_notify為SIGEV_SIGNAL時,結構就包括了超時時送往進程的信號數和應用數據;如果sigev_notify為SIGEV_NONE,則不發送任何通知;sigev_notify其他的值由完成者自行定義。總進程的定時器不被其子進程通過fork()繼承,它應該被exec撤銷。
3 刪除一個總進程定時器
函數原型:#include<time.h>
int timer_delete(time_t timerid);
函數功能:該函數刪除一個指定的定時器,timerid,該定時器是在以前的timer_create()中創建的。
4 總進程定時器
函數原型: #include<time.h>
int timer_settime(timer_t timerid,int flags,const struct itimerspec *value,struct itimerspec *ovalue);
int timer_gettime(timer_t timerid,struct itimerspec *value);
int timer_getoverrun(timer_t timerid);
函數功能:timer_settime()設置時間直到下一個timerid指定的定時器終止。如果該函數調用時定時器已經被裝備,該調用則重置時間直到value確定的下一次終止。如果value的it_value成員為零,定時器被解除。如果flag沒有設定為TIMER_ABSTIME,則定時器從調用開始在it_value十億分之一秒內超時;如果設定為TIMER_ABSTIME,該函數表現為時間直到下一次超時被設定為it_value指定的絕對時間和與timerid相聯的時鍾值的差值。定時器的再裝由value的it_interval成員值來設定。如果參數ovalue不為空,該函數被存儲在ovalue引用的地方。該函數要存儲時間累計值直到timerid指定的定時器終止或重裝定時器值到value參數。在任一時刻,僅有一個單一信號被派了在指定的定時器的進程中。如果支持實時信號擴展,timer_getoverrun()返回定時器終止的溢出值。
5 高度睡眠
函數原型:#include<time.h>
int nanosleep(const struct timespec *rqtp,struct timespec *rmtp);
函數功能:該函數使當前執行的進程掛起直到參數rptp指定的時
間間隔到達或者信號被送到調用進程並且其行為就
是喚醒信號跟蹤功能或者使終止進程。掛起時間也許
要比要求時間長是因為參數值向上舍入成一個整數或者是因為系統對其他活動的調度。但是除非被信號打斷,掛起時間不會少於tqtp值,這是系統時鍾,CLOCK_REALTIME測量的。
第十五章
消息傳遞
15.1 消息隊列的數據定義
1 數據結構
頭文件< mqueue.h>定義了以下執行者定義的類型:
mqd_t :用於消息隊列描述符
頭文件< mqueue.h>定義了以下執行者定義的結構:
struct sigevent: 3.3中定義。mq_attr用來設定消息隊列參數。
struct sigevent結構包含了至少以下的成員:
類型 | 成員名 | 描述 |
long | mq_flags | 消息隊列標志 |
long | mq_maxmsg | 最大消息數 |
long | mq_msgsize | 消息的最大長度 |
long | mq_curmsgs | 當前排列的消息數 |
執行者可作擴展。
15.2消息傳遞函數
1 打開消息隊列
函數原型:#include<mqueue.h>
mqd_t mq_open(const char *name,int oflag,…);
函數功能:該函數在進程和消息隊列之間建立連接。它創建了一個消息隊列描述符指向消息隊列。參數oflag請求對消息隊列發送或接收所需信息。如果調用進程承認對相應保護文件的讀寫請求,則對接收或發送消息的請求允許被通過。
2 關閉一個消息隊列
函數原型:#include<mqueue.h>
int mq_close(mqd_t mqdes);
函數功能:該函數撤銷消息隊列描述符(mqdes)和消息隊列之間的關系。如果進程成功的配屬了mqdes表示的消息隊列通知請求,則這個配屬關系被撤銷,該消息隊列可用於其他進程來配屬通知。
3 移去一個消息隊列
函數原型:#include<mqueue.h>
int mq_unlink(const char *name);
函數功能:該函數移去路徑名name指向的消息隊列。如果該調用成功,並且flag沒有設為O_CREATE,則mq_open()對於同一個name將會失敗。所有對該隊列的引用撤銷后,該隊列才能被關閉。該函數調用不會被阻塞指定所有的引用被關閉。
4 發送一個消息到消息隊列
函數原型:#include<mqueue.h>
int mq_send(mqd_t mqdes,const char *msg_ptr,size_t mag_len,unsigned int msg_prio);
函數功能:該函數添加參數msg_ptr指向的消息到mqdes指定的
消息隊列中去。參數msg_len表示消息長度,以字節
為單位,該參數應小於等於消息隊列的mq_msgsize
參數,否則調用失敗。如果消息隊列沒有滿,則該函
數的功能就是插入消息到消息隊列的指定位置,這個
位置郵msg_prio參數指定。msg_prio大者先插入隊
列,msg_prio的值應小於等於{MQ_PRIO_MAX}。
如果消息已滿並且O_NONBLOCK沒有設定,該函
數阻塞一直到空間可用或者mq_send()被信號中斷。
如果空間可用時,多於一個進程在等待發送則按優先
級,等待最久的進程先發送它的信息。如果O_NON
BLOCK被設定,並且隊列已滿,則函數返回error。
5 從消息隊列接受一條消息
函數原型:#include<mqueue.h>
ssize_t mq_receive(mqd_t mqdes,char *msg_ptr,size_t msg_len,unsigned int *msg_prio);
函數功能:該函數接受mqdes確定的消息隊列中最久優先級最高
的消息,對參數值的限制同上。所選消息從隊列移出,
復制到msa_ptr指向的緩沖區。如果參數msg_prio不
為空,則指定消息被存儲在msa_prio所引用的地方。
如果消息隊列為空,並且O_NONBLODK沒有設定,
該函數阻塞直到消息排列入隊列中或者該函數被信
號中斷。當有多個進程在消息到達隊列后請求接受,
則優先級原則與上相同。
6 通知一個進程隊列中的一條信息可用
函數原型:#include<mqueue.h>
int mq_notify(mqd_t mqdes,const struct sigevent *notification);
函數功能:如果參數notification不為空,函數記錄下調用進程被
通知空的消息隊列(由消息隊列描述符mqdes相聯)
中有一條消息到來。當消息隊列從空到非空時,一條
通知消息將發送到進程中,在任一時刻,只有一個通
知消息被一個消息隊列記錄。如果notifiction為空並
且進程當前被指定的隊列記錄,則已存在的記錄被移
去。
7 設置消息隊列參數
函數原型:#include <mqueue.h>
int mq_setattr(mqd_t mqdes,const struct mq_attr *mqstat,struct mq_attr *omqstat);
函數功能:該函數用來設置與mqdes指定的消息隊列相關的參數。
mq_attr結構中的mq_maxmsg,mq_magsize,mq_curmsgs
成員被mq_setattr()忽略。如果omqstat為非空,則該函
數被存儲,由omqstat指明存儲位置。
8得到消息隊列參數
函數原型:#include<mqueue.h>
int mq_getattr(mqd_t mqdes,struct mq_attr *mqstat);
函數功能:該函數用來取得狀態信息和與mqdes消息隊列相關的
參數。