MSG WAITALL和檔案描述符的阻塞模式

2021-08-09 14:14:21 字數 497 閱讀 5272

recv函式可以設定一些標誌,這也是recv和read的不同之處。

其中有乙個msg_waitall標誌,如果recv設定了這個標誌,當沒有收到請求的位元組數時,recv函式會阻塞。然而,當被訊號打斷,或者發生了錯誤,或者斷開了連線,或者接收到的下乙個資料和已經接收的資料的資料型別不一致時,recv函式即使沒有收到請求的位元組數,也會返回,返回乙個錯誤。

由此可見,設定了msg_waitall標誌的recv函式,類似於前文的readn函式,不同的是readn函式對被訊號打斷的情況進行了處理,而msg_waitall則沒有進行處理。

既然該標誌可以使recv函式阻塞,那這和檔案描述符的阻塞模式相比,有什麼區別呢?

如果檔案描述符處於阻塞模式,執行recv操作時,如果接收緩衝區沒有資料,會一直阻塞,直到接收緩衝區有資料。然而,設定了msg_waitall的recv,即使緩衝區有資料,只要資料位元組數小於請求位元組數,recv就會阻塞。

可見,msg_waitall和檔案描述符的阻塞模式,發生阻塞的是兩個階段。

檔案流和 檔案描述符

include apue.h int glob 6 int main void else if pid 0 i printf pid d,glob d,var d n getpid glob,var sprintf buf,d n i write stdout fileno,buf,strlen b...

檔案指標和檔案描述符

原文 檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的...

檔案指標和檔案描述符

檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的指標。...