Nginx 父子程序通訊

2021-06-19 00:19:48 字數 2462 閱讀 2712

一. 參考《nginx核心講解》後加上參考原始碼,小結下nginx中父子程序、子程序間如何通訊。

實現原理網上都可以查出來,主要是通過socketpair()函式實現的,下面捋一下內部流程:

1. 話說要從ngx_start_worker_processes函式講起,由於**不多,貼出來:

static void

ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)

}ngx_pid_t

ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,

char *name, ngx_int_t respawn)

//...

/*各種套接字屬性設定*/

ngx_channel = ngx_processes[s].channel[1];//ngx_channel幹啥用的?留個懸念

//...

/*重點來了,建立子程序*/

pid = fork();

switch (pid)

//...

/*對子程序的相關資訊進行儲存*/

ngx_processes[s].pid

//...

/*陣列下標加1*/

if (s == ngx_last_process)

return pid;

}ngx_spawn_process()函式是在乙個for迴圈中呼叫,假如有4個子程序,也就是說會進行四次

socketpair()的建立執行,每一次的建立,ngx_processes[s].channel都會有兩個fd生成,

假設進行第一次迴圈時,ngx_processes[0].channel裡面已經有ngx_processes[0].channel[0]和

ngx_processes[0].channel[1],繼續往下執行,執行子程序建立執行proc(cycle, data);時,呼叫

static void

ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)

}static void

ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)

/*在子程序中關閉掉channel[0],只需要用channel[1]*/

if (close(ngx_processes[ngx_process_slot].channel[0]) == -1)

/*這個比較重要,但還沒理解透*/

if (ngx_add_channel_event(cycle, ngx_channel, ngx_read_event,

ngx_channel_handler)

== ngx_error)

}ngx_int_t

ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, ngx_int_t event,

ngx_event_handler_pt handler)

將描述符第二個引數fd,而fd就是ngx_channel加入到了事件中

ngx_channel在**?

ngx_channel來自於ngx_spawn_process()中

ngx_channel = ngx_processes[s].channel[1];

*/ if (ngx_add_conn && (ngx_event_flags & ngx_use_epoll_event) == 0)

} else

}return ngx_ok;

}/*當有可讀事件來的時候,觸發該函式*/

static void

ngx_channel_handler(ngx_event_t *ev)

} //...

}從上面可以小結一下,感覺一下,子程序擁有套接字ngx_processes[s].channel[1],並加入

了可讀事件中,一直等待著讀,即等待著呼叫recvmsg(),那麼由誰來sendmsg呢?通過哪個

套接字呢?

繼續:視線回到ngx_spawn_process()函式中,該函式帶領我們一步步走進子程序的處理過程,回到

該函式呼叫的地方即函式ngx_start_worker_processes()中,它下面接著執行ch.pid、ch.slot

、ch.fd的賦值,用處在下面:接著呼叫

/*注意呼叫該函式是在父程序中執行*/

static void

ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch)

}綜上: 建立乙個子程序時,父程序就會向各個channel[0]中sendmsg,子程序從channel[1]recvmsg。

nginx 父子程序通訊 channel

nginx 中利用socketpair 函式,建立一對相互連線的socket,實現父子程序的通訊。下面分析下整個過程 一 建立 在子程序建立之前,需要建立這樣一對連線 ngx spawn process函式 ngx process.c中 二 建立子程序 接著會通過fork建立子程序,在子程序中,會呼...

父子程序間訊號通訊

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

QT 父子程序間通訊

1.父程序設計 1.1首先建立程序類 ifndef myprocess h define myprocess h include class myprocess public qprocess endif myprocess h include myprocess.h myprocess mypro...