tux() - Unix 和 Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

tux() - Unix 和 Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

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_majorreq->version_minorreq->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_0HTTP_1_1 之一
http_method
 METHOD_NONEMETHOD_GETMETHOD_HEADMETHOD_POSTMETHOD_PUT 之一
sock套接字檔案描述符;寫入此檔案將資料傳送到與此請求關聯的已連線客戶端。不要從此套接字檔案描述符讀取;您可能會混淆 HTTP 引擎。
eventtux 模組使用的私有、每個請求狀態。只要請求處於活動狀態,系統就會保留此值。
thread_nr
 執行緒索引;請參閱TUX_ACTION_STARTTHREAD 的討論。
idtux 守護程序內部的值,用於將請求多路複用到正確的模組。
privevent 類似,只是它指向私有資料而不是整數。
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)都表示發生了錯誤。

缺陷

此手冊頁不完整。

previous next Printer Friendly

廣告


  

廣告



廣告