nginx原始碼學習(五)程序間的通訊

2021-08-02 22:35:05 字數 2612 閱讀 4905

nginx啟動worker程序的函式主體還是比較簡單的

static

void

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

}

for迴圈啟動配置的worker程序個數,下面主要分析兩個函式:

ngx_spawn_process和ngx_pass_open_channel;

ngx_pid_t

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

char *name, ngx_int_t respawn)

else

}//超過最大程序數會報錯 unix:1024

if (s == ngx_max_processes)

}if (respawn != ngx_process_detached)

ngx_log_debug2(ngx_log_debug_core, cycle->log, 0,

"channel %d:%d",

ngx_processes[s].channel[0],

ngx_processes[s].channel[1]);

//下面是設定非阻塞和非同步模式

if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1)

if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1)

on = 1;

if (ioctl(ngx_processes[s].channel[0], fioasync, &on) == -1)

if (fcntl(ngx_processes[s].channel[0], f_setown, ngx_pid) == -1)

if (fcntl(ngx_processes[s].channel[0], f_setfd, fd_cloexec) == -1)

if (fcntl(ngx_processes[s].channel[1], f_setfd, fd_cloexec) == -1)

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

} else

ngx_process_slot = s;

//建立子程序

pid = fork();

switch (pid)

ngx_log_error(ngx_log_notice, cycle->log, 0, "start %s

%p", name, pid);

ngx_processes[s].pid = pid;

ngx_processes[s].exited = 0;

if (respawn >= 0)

//主程序記錄資訊後return 子程序pid

ngx_processes[s].proc = proc;

ngx_processes[s].data = data;

ngx_processes[s].name = name;

ngx_processes[s].exiting = 0;

switch (respawn)

if (s == ngx_last_process)

return pid;

}

接下來看看:ngx_pass_open_channel,主程序如何告知之前建立的worker程序與新建立的worker程序通訊

ngx_int_t

ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,ngx_log_t *log)

cmsg;

if (ch->fd == -1) else

msg.msg_flags = 0;

#else

if (ch->fd == -1) else

#endif

iov[0].iov_base = (char *) ch;

iov[0].iov_len = size;

msg.msg_name = null;

msg.msg_namelen = 0;

msg.msg_iov = iov;

msg.msg_iovlen = 1;

//關於匿名套接字傳遞fd可檢視

//n = sendmsg(s, &msg, 0);

if (n == -1)

ngx_log_error(ngx_log_alert, log, err, "sendmsg() failed");

return ngx_error;

}return ngx_ok;

}

最後,就目前nginx**來看,子程序並沒有往父程序傳送任何訊息,子程序之間也沒有相互通訊的邏輯,也許是因為nginx有其它一些更好的程序通訊方式,比如共享記憶體等,所以這種channel通訊目前僅做為父程序往子程序傳送訊息使用,但由於有這個基礎在這,如果未來要使用channel做這樣的事情,的確是可以的。

nginx原始碼學習(五)

我們接著上篇文章來講講ngx get options函式。這個函式就在nginx.c檔案中,我們來看看。引數argc,argv我們在前面的文章中都已經提到了,在這裡我們看ngx get options裡面的for迴圈。它的作用就是把所有的執行時引數迴圈一遍,判斷是不是合法。例如 nginx s st...

nginx原始碼學習

nginx原始碼學習是乙個痛苦又快樂的過程,下面列出了一些nginx的學習資源。看了nginx原始碼,發現這是乙份完全沒有注釋,完全沒有配置文件的 這份注釋版原始碼會不斷進行更新的 好了,第乙個問題,nginx的main函式在 呢?src core nginx.c 第二個問題,nginx啟動的時候都...

nginx原始碼分析 程序間通訊機制 同步機制

nginx原始碼分析 程序間通訊機制 從nginx的程序模型可以知道,master程序和worker程序需要通訊,nginx中通訊的方式有套接字 共享記憶體 訊號。對於master程序,從外部接受訊號,master程序主要就是監控 接受外部訊號,將有必要的訊號傳遞給worker程序,master程序...