一. 參考《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...