tux() - Unix 和 Linux 系統呼叫
廣告
名稱tux - 與 TUX 核心子系統互動語法
#include <sys/tuxmodule.h>
int tux (unsigned int action, user_req_t * req);
|
描述tux() 系統呼叫呼叫核心代表當前正在執行的使用者空間 TUX 模組執行操作。
操作可以是以下之一
enum tux_actions {
TUX_ACTION_STARTUP = 1,
TUX_ACTION_SHUTDOWN = 2,
TUX_ACTION_STARTTHREAD = 3,
TUX_ACTION_STOPTHREAD = 4,
TUX_ACTION_EVENTLOOP = 5,
TUX_ACTION_GET_OBJECT = 6,
TUX_ACTION_SEND_OBJECT = 7,
TUX_ACTION_READ_OBJECT = 8,
TUX_ACTION_FINISH_REQ = 9,
TUX_ACTION_FINISH_CLOSE_REQ = 10,
TUX_ACTION_REGISTER_MODULE = 11,
TUX_ACTION_UNREGISTER_MODULE = 12,
TUX_ACTION_CURRENT_DATE = 13,
TUX_ACTION_REGISTER_MIMETYPE = 14,
TUX_ACTION_READ_HEADERS = 15,
TUX_ACTION_POSTPONE_REQ = 16,
TUX_ACTION_CONTINUE_REQ = 17,
TUX_ACTION_REDIRECT_REQ = 18,
TUX_ACTION_READ_POST_DATA = 19,
TUX_ACTION_SEND_BUFFER = 20,
TUX_ACTION_WATCH_PROXY_SOCKET = 21,
TUX_ACTION_WAIT_PROXY_SOCKET = 22,
TUX_ACTION_QUERY_VERSION = 23,
MAX_TUX_ACTION
};
|
下面列出的第一個操作值是管理性的,通常僅在 tux 程式中使用。 TUX_ACTION_STARTUP 啟動 tux 子系統,並使用 NULL req。待辦事項:只有 root 可以使用 TUX_ACTION_STARTUP。 TUX_ACTION_SHUTDOWN 停止 tux 子系統,並接受任何req,即使是零填充的req。 TUX_ACTION_STARTTHREAD 每個執行緒呼叫一次,其中req->thread_nr 元素從 0 開始單調遞增。 TUX_ACTION_STOPTHREAD 當前未使用 tux 守護程序,因為所有執行緒在 TUX_ACTION_SHUTDOWN 上都會自動停止。它仍然可用,因為它在 tux 守護程序尚未處理的情況下可能很有用。 TUX_ACTION_REGISTER_MODULE 註冊由req->modulename 字串標識的使用者空間模組。一個 VFS 名稱只能註冊一次。
req->version_major、req->version_minor 和req->version_patch 必須分別從 TUX_MAJOR_VERSION、TUX_MINOR_VERSION 和 TUX_PATCHLEVEL_VERSION 設定為適當的值;核心將檢查模組的二進位制相容性。 TUX_ACTION_UNREGISTER_MODULE 取消註冊由 req->modulename 字串標識的使用者空間模組。只有已註冊的模組才能取消註冊。 TUX_ACTION_CURRENT_DATE 將當前日期字串設定為 req->new_date。日期字串必須符合 RFC 1123 且必須單調遞增。tux 守護程序通常每秒呼叫一次。 TUX_ACTION_REGISTER_MIMETYPE 設定副檔名 req->objectname 以對映到 mimetype req->object_addr。tux 守護程序通常在 /etc/tux.mime.types 中註冊 mime 型別,但模組可以想象建立自己的 mimetype 對映。 TUX_ACTION_QUERY_VERSION 返回核心 TUX 子系統的主版本、次版本和補丁級別,在返回值中編碼為
(TUX_MAJOR_VERSION << 24) | (TUX_MINOR_VERSION << 16) | TUX_PATCHLEVEL_VERSION
如果系統呼叫將 errno 設定為 EINVAL,則假設主版本為 2,次版本為 1。
其餘的操作值用於響應 TUX 事件。總體架構是呼叫 TUX 的事件迴圈來捕獲 HTTP 事件,然後生成響應以響應這些事件。 TUX_ACTION_EVENTLOOP 呼叫 TUX 事件迴圈 - TUX 子系統將立即返回新的請求req,或等待新的請求到達。 TUX_ACTION_GET_OBJECT 發出對req->objectname 中命名的 URL 物件的請求。如果物件無法立即使用,則當前處理的請求將被掛起,並返回一個新的請求,或者 TUX 子系統等待新的請求。 URL 物件是透過 URL 訪問的資料流,並直接與該 URL 指向的檔案相關聯。(將來,我們可能會擴充套件 URL 物件的概念。)
TUX_ACTION_SEND_OBJECT 將當前 URL 物件傳送到客戶端。 TUX_ACTION_READ_OBJECT 將當前 URL 物件讀入req->object_addr 指定的地址。除非req->objectlen >= 0,否則不得呼叫 TUX_ACTION_READ_OBJECT。 TUX_ACTION_READ_HEADERS 將一個非零分隔符字串讀入 req->object_addr,字串的長度儲存在 req->objectlen 中。這是一種用於讀取 tux 當前未解析的欄位的解決方法;如果您需要它,請將其報告為錯誤,以便可以向 user_req 新增更多欄位(除非您的用途非常專門,以至於沒有普遍效用)。 TUX_ACTION_POSTPONE_REQ 推遲請求,這意味著在呼叫 TUX_ACTION_CONTINUE_REQ 之前,任何 tux 系統呼叫都不會為此請求返回資料。 TUX_ACTION_CONTINUE_REQ 繼續推遲的請求。與普通的 TUX_ACTION 不同,它以套接字描述符作為引數(如果需要,這允許它從與呼叫 TUX_ACTION_POSTPONE_REQ 的程式無關的程式中呼叫)。它像這樣呼叫
ret = tux(TUX_ACTION_CONTINUE_REQ, (user_req_t *)socket);
|
TUX_ACTION_READ_POST_DATA 是一個原子操作(它將始終返回相同的請求,無需處理新請求),它將非零分隔符 POST 資料(最多 req->objectlen 中設定的最大值,並受 /proc/sys/net/tux/max_header_len 限制)放入 req->object_addr,並將 req->objectlen 重置為長度。 TUX_ACTION_REDIRECT_REQ 導致請求重定向到輔助伺服器。(無需呼叫 TUX_ACTION_FINISH_REQ。) TUX_ACTION_FINISH_REQ 完成並記錄請求。 TUX_ACTION_FINISH_CLOSE_REQ 與 TUX_ACTION_FINISH_REQ 類似,但它還會關閉 HTTP 1.1 保活連線。 TUX_ACTION_SEND_BUFFER 與 TUX_ACTION_SEND_OBJECT 類似,但它會發送 req->object_addr 緩衝區中的任何內容。這可以用作通用輸出緩衝區。 TUX_ACTION_WATCH_PROXY_SOCKET 設定一個非 TUX 套接字,用於與 TUX_ACTION_WAIT_PROXY_SOCKET 一起使用。套接字必須是網路套接字。該函式是原子的。對該操作的重複呼叫將替換以前的代理套接字,因此無需對其進行反初始化。套接字檔案描述符必須放入 req->object_addr 中。 TUX_ACTION_WAIT_PROXY_SOCKET 推遲當前請求,直到透過 TUX_ACTION_WATCH_PROXY_SOCKET 設定的套接字上有輸入資料包。代理套接字有一個保活計時器正在執行。一旦套接字上有輸入活動,請求就會恢復 - 模組可以使用套接字上的非阻塞 recv() 處理輸入資料包。 user_req_t req 是 TUX 子系統返回的請求。定義的欄位取決於版本。對於主版本 2,它們是
typedef struct user_req_s {
int version_major;
int version_minor;
int version_patch;
int http_version;
int http_method;
int sock;
int event;
int thread_nr;
void *id;
void *priv;
int http_status;
int bytes_sent;
char *object_addr;
int module_index;
char modulename[MAX_MODULENAME_LEN];
unsigned int client_host;
unsigned int objectlen;
char query[MAX_URI_LEN];
char objectname[MAX_URI_LEN];
unsigned int cookies_len;
char cookies[MAX_COOKIE_LEN];
char content_type[MAX_FIELD_LEN];
char user_agent[MAX_FIELD_LEN];
char accept[MAX_FIELD_LEN];
char accept_charset[MAX_FIELD_LEN];
char accept_encoding[MAX_FIELD_LEN];
char accept_language[MAX_FIELD_LEN];
char cache_control[MAX_FIELD_LEN];
char if_modified_since[MAX_FIELD_LEN];
char negotiate[MAX_FIELD_LEN];
char pragma[MAX_FIELD_LEN];
char referer[MAX_FIELD_LEN];
char *post_data;
char new_date[DATE_LEN];
int keep_alive;
} user_req_t;
|
對於主版本 3,它們是
typedef struct user_req_s {
uint32_t version_major;
uint32_t version_minor;
uint32_t version_patch;
uint32_t http_version;
uint32_t http_method;
uint32_t http_status;
uint32_t sock;
uint32_t event;
uint32_t error;
uint32_t thread_nr;
uint32_t bytes_sent;
uint32_t client_host;
uint32_t objectlen;
uint32_t module_index;
uint32_t keep_alive;
uint32_t cookies_len;
uint64_t id;
uint64_t priv;
uint64_t object_addr;
uint8_t query[MAX_URI_LEN];
uint8_t objectname[MAX_URI_LEN];
uint8_t cookies[MAX_COOKIE_LEN];
uint8_t content_type[MAX_FIELD_LEN];
uint8_t user_agent[MAX_FIELD_LEN];
uint8_t accept[MAX_FIELD_LEN];
uint8_t accept_charset[MAX_FIELD_LEN];
uint8_t accept_encoding[MAX_FIELD_LEN];
uint8_t accept_language[MAX_FIELD_LEN];
uint8_t cache_control[MAX_FIELD_LEN];
uint8_t if_modified_since[MAX_FIELD_LEN];
uint8_t negotiate[MAX_FIELD_LEN];
uint8_t pragma[MAX_FIELD_LEN];
uint8_t referer[MAX_FIELD_LEN];
uint8_t new_date[DATE_LEN];
} user_req_t;
|
標籤 | 描述 |
version_major | | 始終設定為 TUX_MAJOR_VERSION,用於標記二進位制不相容性。 |
version_minor | | 始終設定為 TUX_MINOR_VERSION,用於標記二進位制不相容性。 |
version_patch | | 始終設定為 TUX_PATCHLEVEL_VERSION,用於標記二進位制不相容性。 |
http_version | | HTTP_1_0 或HTTP_1_1 之一 |
http_method | | METHOD_NONE、METHOD_GET、METHOD_HEAD、METHOD_POST 或METHOD_PUT 之一 |
sock | 套接字檔案描述符;寫入此檔案將資料傳送到與此請求關聯的已連線客戶端。不要從此套接字檔案描述符讀取;您可能會混淆 HTTP 引擎。 |
event | tux 模組使用的私有、每個請求狀態。只要請求處於活動狀態,系統就會保留此值。 |
thread_nr | | 執行緒索引;請參閱TUX_ACTION_STARTTHREAD 的討論。 |
id | tux 守護程序內部的值,用於將請求多路複用到正確的模組。 |
priv | 與event 類似,只是它指向私有資料而不是整數。 |
http_status | | 將錯誤狀態設定為整數以進行錯誤報告。預設情況下狀態良好,因此除非要報告錯誤,否則不應修改它。 |
bytes_sent | | 當您寫入 sock 時,必須將 bytes_sent 設定為自上次對該req 執行 tux() 操作以來發送的位元組總數,否則日誌條目的傳送位元組計數將不正確。(這可能會在將來的 tux 版本中更改或消失。) |
object_addr | | 設定為至少req->objectlen 大小的緩衝區的地址,以便使用 TUX_ACTION_READ_OBJECT 操作從 URL 快取中讀取物件。除非req->objectlen >= 0,否則不得呼叫 TUX_ACTION_READ_OBJECT,並且 TUX 隱式依賴於req->object_addr 至少為req->objectlen 大小。 |
module_index | | tux(8) 守護程序用於確定將哪個可載入模組與req 關聯。 |
modulename | | 由 TUX_ACTION_REGISTER_MODULE 設定的模組名稱;tux 守護程序的私有資料。 |
client_host | | sock 連線到的主機的 IP 地址。 |
objectlen | | 滿足當前請求的檔案的大小,該檔案當前位於 URL 快取中。如果請求在 TUX_ACTION_GET_OBJECT 後返回,則會設定此值。模組應確保在呼叫 TUX_ACTION_READ_OBJECT 之前,req->object_addr 處的緩衝區至少為req->objectlen 大小。 |
query | 客戶端傳送的完整查詢字串。 |
objectname | | 使用 TUX_ACTION_GET_OBJECT 操作指定要獲取的 URL 的名稱。如果 URL 無法立即使用(即不在 URL 快取中),則請求將排隊,並且 tux 子系統可能會在等待時繼續處理其他就緒請求。 |
cookies_len | | 如果請求標頭中存在 cookie,則cookies_len 包含cookies 字串的長度 |
cookies | | 如果請求標頭中存在 cookie,則cookies 是將 cookie 傳遞給模組的字串。 |
content_type | | 請求的 Content-Type 標頭值 |
user_agent | | 請求的 User-Agent 標頭值 |
accept | 請求的 Accept 標頭值 |
accept_charset | | 請求的 Accept-Charset 標頭值 |
accept_encoding | | 請求的 Accept-Encoding 標頭值 |
accept_language | | 請求的 Accept-Language 標頭值 |
cache_control | | 請求的 Cache-Control 標頭值 |
if_modified_since | | 請求的 If-Modified-Since 標頭值 |
negotiate | | 請求的 Negotiate 標頭值 |
pragma | 請求的 Pragma 標頭值
|
referer | | 請求的 Referer 頭部值 |
post_data | | 對於 POST 請求,傳入的資料會被放置在 post_data 中。 |
new_date | | 返回當前日期/時間 |
keep_alive | | 請求的 KeepAlive 頭部值
|
返回值
tux() 返回以下值
enum tux_reactions {
TUX_RETURN_USERSPACE_REQUEST = 0,
TUX_RETURN_EXIT = 1,
TUX_RETURN_SIGNAL = 2,
};
|
TUX_RETURN_USERSPACE_REQUEST 表示核心已將新的請求放入 req 中;必須使用 TUX_ACTION_GET_OBJECT、TUX_ACTION_SEND_OBJECT、TUX_ACTION_READ_OBJECT 或 TUX_ACTION_FINISH_REQ 中的一個來響應此請求。 TUX_RETURN_EXIT 表示 TUX 已停止。 TUX_RETURN_SIGNAL 表示發生了訊號。沒有安排新的請求。
錯誤任何負值(例如 -EFAULT、-EINVAL)都表示發生了錯誤。
缺陷此手冊頁不完整。
廣告
|