函式:使用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...