Значит, сокеты, генерируемые функцией socketpair (), доступны для разных процессов? - PullRequest
2 голосов
/ 02 июня 2011

Как мы знаем, fd (дескриптор файла, точнее int) относится к процессу, то есть один и тот же файл, открытый в разных процессах, может иметь разные fd.

А я так и думал, должно быть для розеток.

Но при чтении исходного кода 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

1 Ответ

3 голосов
/ 02 июня 2011

nginx использует вспомогательные сообщения сокетов домена unix (в частности, сообщение SCM_RIGHTS, см. Справочную страницу для протокола unix для получения дополнительной информации об этом) для передачи файловых дескрипторов.

Когда вы получаете сообщение SCM_RIGHTS, ядро ​​в основном выдает дубликат (как в dup) файлового дескриптора, действительный в процессе получения.Этот fd может иметь или не иметь один и тот же номер, что очень мало значит, так как принимающая сторона должна использовать содержимое сообщения, а не некоторые предварительные знания.

...