2011-06-02 43 views
2

正如我們所知道的fd(文件描述符,確切地說是一個int)是每個進程,也就是說,在不同進程中打開的相同文件可能會有不同的fd因此socketpair()生成的套接字可用於不同的進程嗎?

而我認爲應該是插座。

但是看完nginx的源代碼時,我發現它使用套接字進程間通信:

if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) 
    { 
     ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, 
         "socketpair() failed while spawning \"%s\"", name); 
     return NGX_INVALID_PID; 
    } 

這裏ngx_processes[s].channel[0]發送到其他進程。

但正如我所說fd是每個進程,它如何確保相同的int將指向相同的套接字?

UPDATE

爲什麼問題是現在是如何工作的(它是Nginx的使用方法相同)?

http://swtch.com/usr/local/plan9/src/lib9/sendfd.c

+0

您的代碼片段不包含任何關於「將fd發送到另一個進程」的內容,因此無法回答。答案取決於你是否在分離流程之間轉移fds或使用一些hack。 – 2011-06-02 12:42:58

+0

@R ..,上面的代碼不包含將'socketfd'發送到其他進程的邏輯。你的意思是,如果使用分叉,可以在進程間使用相同的fd? – 2011-06-02 12:45:57

+0

因此,您的問題實際上無法以其當前形式回答。 – 2011-06-02 12:46:47

回答

3

nginx的使用UNIX域套接字輔助消息(具體而言是SCM_RIGHTS消息,請參閱man page for the unix protocol的更多信息,這一點),以通過周圍的文件描述符。

當您收到SCM_RIGHTS消息時,內核基本上會爲您提供一個在接收過程中有效的文件描述符(如dup)。這個fd可能有也可能沒有相同的號碼,這一點很重要,因爲接收方應該使用該消息的內容而不是一些先前的知識。

相關問題