網路程式設計實戰25 阻塞I O和程序模型 傳統方式

2021-10-23 12:46:06 字數 1661 閱讀 5346

函式:使用fork函式建立子程序

pid_t fork

(void

)返回:在子程序中為0,在父程序中為子程序id,若出錯則為-

1

使用:父子程序通過返回值來區別

if

(fork()

==0)else

函式:

有兩種方式可以在子程序退出後**資源,分別是呼叫 wait 和 waitpid 函式。

pid_t wait

(int

*statloc)

;pid_t waitpid

(pid_t pid,

int*statloc,

int options)

;

使用:

處理子程序退出的方式一般是註冊乙個訊號處理函式,捕捉訊號 sigchild 訊號,然後再在訊號處理函式裡呼叫 waitpid 函式來完成子程序資源的**。sigchld 是子程序退出或者中斷時由核心向父程序發出的訊號,預設這個訊號是忽略的。所以,如果想在子程序退出時能**它,需要像下面一樣,註冊乙個 sigchold 函式。

訊號處理函式中要使用while,因為當父程序接收到子程序(第乙個)訊號進行wait()或waitpid()時,會遮蔽掉下乙個的sigchld訊號,實際的效果就是在訊號處理函式返回前不會重入。那麼當父程序在執行訊號處理函式時,又有子程序(第二個)退出,那麼訊號會被阻塞並等待處理,假如(第三個)又來了,那麼它是被拋棄的,後續的都會拋棄。。。

signal

(sigchld, sigchld_handler)

;//使用waitpid**

void

sigchld_handler

(int sig)

伺服器父程序負責accept,得到新的connfd後交給子程序來處理

#include

"../lib/common.h"

#define max_line 4096

inttcp_server_listen

(int port)

char

rot13_char

(char c)

void

child_run

(int fd)

if(outbuf_used <

sizeof

(outbuf)

) outbuf[outbuf_used++]=

rot13_char

(ch);if

(ch ==

'\n')}

}//使用waitpid**

void

sigchld_handler

(int sig)

intmain

(int argc,

char

**ar**)

//如果是子程序,關閉監聽fdif(

fork()

==0)else

}return0;

}

網路程式設計之IO模型 非阻塞IO

linux下,可以通過設定socket使其變為non blocking。當對乙個non blocking socket執行讀操作時,流程是這個樣子 從圖中可以看出,當使用者程序發出read操作時,如果kernel中的資料還沒有準備好,那麼它並不會block使用者程序,而是立刻返回乙個error。從使...

網路程式設計io總結區分。阻塞,非阻塞,非同步,同步

借鑑提煉自 在網路程式設計中,肯定會有讀寫io的問題。這時候就會有了五種io模型。取自unix network programing 五種模型分別是,阻塞,非阻塞,io多路復用 select poll epoll 訊號驅動,非同步。這五種有時候容易出現混亂。網上部落格寫的也比較晦澀,不過看那本書裡的...

Linux網路程式設計(三) IO非阻塞操作

io非阻塞操作 sock的方法不一定非得是阻塞的,也可以非阻塞的操作。有兩種方法分別為設定fcntl 和設定相應函式的引數。服務端 include include include include include include include include define bufsize 128 i...