nginx 父子程序通訊 channel

2021-05-23 15:32:22 字數 1172 閱讀 1118

nginx 中利用socketpair()函式,建立一對相互連線的socket,實現父子程序的通訊。 下面分析下整個過程:

一  建立

在子程序建立之前,需要建立這樣一對連線:  ngx_spawn_process函式(ngx_process.c中)

二 建立子程序

接著會通過fork建立子程序,在子程序中,會呼叫ngx_worker_process_init 函式(ngx_process_cycle.c)

channel[0] 是用來傳送資訊的,channel[1]是用來接收資訊的。那麼對自己而言,它需要向其他程序傳送資訊,需要保留其它程序的channel[0], 關閉channel[1]; 對自己而言,則需要關閉channel[0]。 最後把ngx_channel放到epoll中,從第一部分中的介紹我們可以知道,這個ngx_channel實際就是自己的 channel[1]。這樣有資訊進來的時候就可以通知到了。

三 實現子程序自己的通訊

子程序建立的時候,父程序的東西都會被子程序繼承,所以後面建立的程序能夠得到前面程序的channel資訊,直接可以和他們通訊,那麼前面建立的程序如何知道後面的程序資訊呢? 很簡單,既然前面建立的程序能夠接受訊息,那麼我就發個資訊告訴他後面的程序的channel,並把資訊儲存在channel[0]中,這樣就可以相互通訊了。

ngx_pass_open_channel函式中實現(ngx_process_cycle.c)

我們來看看 ngx_write_channel

其實就是複製資訊,在傳送。我們再看看接受到資訊的那段如何處理:ngx_chanel_read 函式

先接受資訊,再複製資訊,下面就是真正的處理了 ngx_channel_handler函式中(ngx_process_cycle.c)

ngx_processes[ch.slot].pid = ch.pid;

ngx_processes[ch.slot].channel[0] = ch.fd;

就是在對應的位置上覆制pid和fd,下次嚮往哪個程序發資訊的時候,直接發到 ngx_process[目標程序].channel[0]

四 父程序

對於父程序而言,他知道所有程序的channel[0], 直接可以向子程序傳送命令。

疑問: 父程序的channel[1]沒有關閉,那麼是不是子程序a向b傳送資訊的時候,父程序也能收到?知道了高手指導下,謝謝

Nginx 父子程序通訊

一.參考 nginx核心講解 後加上參考原始碼,小結下nginx中父子程序 子程序間如何通訊。實現原理網上都可以查出來,主要是通過socketpair 函式實現的,下面捋一下內部流程 1.話說要從ngx start worker processes函式講起,由於 不多,貼出來 static void...

websocket通訊,chan通訊,聊天

實現功能 websocket通訊 使用包 github.com gin gonic gin start is 專案執行前,協程開啟start go manager.start func manager clientmanager start manager.send jsonmessage,conn...

父子程序間訊號通訊

司機售票員問題 建立子程序代表售票員,父程序代表司機,同步過程如下 售票員捕捉sigint 代表開車 發sigusr1給司機,司機列印 let s gogogo 售票員捕捉sigiquit 代表停車 發sigusr2給司機,司機列印 stop the bus 司機捕捉sigtstp 代表車到站 發s...