?? unix系統開發-系統調用-stream機制.txt
字號:
UNIX系統開發-系統調用-STREAM機制
基本上所有的系統調用成功時返回0或正數,失敗時返回負值。
流的高級操作
poll系統調用的格式
#include <stropts.h>
#include <poll>
int poll(fds,nfds,timeout)
struct pollfd fds[]; /*流組描述結構*/
unsigned long nfds; /*流個數*/
int timeout; /*查詢超時時間*/
參數與功能說明:
參數nfds指出流組中流的個數,而fds是一個流組描述結構,他的格式如下:
struct pollfd
{
int fd; /*流描述符*/
short events; /*用戶期望的事件*/
short revents; /*流上發生的事件*/
}fds[nfds];
其功能是查詢流組中各條流上是否發生了用戶期望的事件。若有事件發生,則將發生的事件登記在流組描述結構的revents域中,返回給用戶。如果沒有任何事件發生,則睡眠等待直到有事件發生或等待超時。超時時間有參數timeout給出,單位為毫秒。Timeout為-1時,表示timeout取值無窮大,可以無限止地等待。
用戶期望的事件有三類,他們的取值及含義如下:
POLLIN:期望相應流上能到達一個數據消息。
POLLOUT:期望能向相應流上發送一個數據消息。
POLLPRI:期望相應流上能到達一個高優先權數據消息(高優先權是一個控制消息)
Revents取值有三種情形:0、已發生的事件、出錯事件。
0表示相應流上沒有發生任何期望的事件。已發生的事件即是對該流期望的事件;出錯事件是poll調用出錯時設置的值,他可有三種取值,在revents中可能是這三種值的"或"。出錯事件的取值及其含義如下:
POLLERR:流上到達一個錯誤消息,以后對流的操作不能繼續進行。
POLLHUP:流上出現了掛起條件,此后不能對流再發送消息。
POLLNVAL:非法流描述符。
ioctl系統調用的格式
#include <unistd.h>
int ioctl(fd,I_SETSIG,events)
int fd; /*流描述符*/
short events; /*用戶設置的期望事件*/
參數與功能說明:
當指定流上發生期望事件時,系統向調用進程發送一個SIGPOLL信號。I_SETSIG命令能設置的期望事件如下:
S_INPUT:流首到達了一個數據消息,在它到達之前,流首沒有數據消息存在。
S_OUTPUT:含義同POLLOUT。
S_HIPRI:含義同POLLPRI。
S_MSG:流首到達了含有SIGPOLL信號消息的消息。
putmsg,getmsg系統調用的格式
#include <stropts.h>
int putmsg(fd,ctlptr,dataptr,flags)
int fd; /*流描述符*/
struct strbuf ctlptr; /*控制信息緩沖*/
struct strbuf *dataptr; /*數據信息緩沖*/
int flags ; /*發送標志*/
int getmsg(fd,ctlptr,dataptr,flags)
int fd; /*流描述符*/
struct strbuf ctlptr; /*控制信息緩沖*/
struct strbuf *dataptr; /*數據信息緩沖*/
int flags ; /*接收標志*/
參數與功能說明:
putmsg將具有控制信息和數據信息的消息順流向下發送,控制信息放入由ctlptr指出的具有strbuf結構形式的緩沖區中,而數據信息放入由dataptr指出的具有strbuf結構形式的緩沖區中;getmsg與putmsg相反,它從流首接收消息,將數據信息和控制信息分別放入由dataptr,ctlptr指出的緩沖區中。Strbuf的結構形式如下:
struct strbuf
{
int maxlen; /*緩沖區最大長度*/
int len; /*緩沖區中已有信息的字節數*/
char *buf; /*指向緩沖區的指針*/
}
select系統調用的格式
#include <sys/types.h>
#include <sys/time.h>
#include <sys/select.h>
int select(maxfdpl,readfds, writefds,exceptfds,timeout)
int maxfdpl; /*需要輪詢的最大描述符*/
fd_set *readfds; /*讀就緒描述符*/
fd_set *writefds; /*寫就緒描述符*/
fd_set *exceptfds; /*異常條件*/
struct timeval *timeout; /*等待時間*/
參數與功能說明:
本系統調用通過修改readfds,writefds,exceptfds這三個參數來指示各參數中的哪些描述符已對指定的條件就緒。這三個參數也是值結果參數,調用者應使用FD_ISSET宏測試fd_set結構中的指定位。本系統調用返回就緒的描述符總數,如果在任何描述符前定時器值已到,則返回0值。通常出錯時返回值是-1。
select調用涉及到幾個宏,現分述如下:
FD_ZERO(fd_set *fdset):在fd_set中清掉所有位。
FD_SET(int fd, fd_set *fdset):在fd_set中把fd位置上。
FD_CLR(int fd,fd_set *fdset):在fd_set中把fd位清掉。
FD_ISSET(int fd,fd_set *fdset):測試fd_set中fd位是否置上。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -