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程序...