Так как же nginx меняет название процесса? - PullRequest
0 голосов
/ 01 июня 2011

Эта функция реализует API для изменения названия процесса:

http://lxr.evanmiller.org/http/source/os/unix/ngx_setproctitle.c

59     for (i = 0; environ[i]; i++) {
 60         if (ngx_os_argv_last == environ[i]) {
 61 
 62             size = ngx_strlen(environ[i]) + 1;
 63             ngx_os_argv_last = environ[i] + size;
 64 
 65             ngx_cpystrn(p, (u_char *) environ[i], size);
 66             environ[i] = (char *) p;
 67             p += size;
 68         }
 69     }
 70 
 71     ngx_os_argv_last--;
 72 
 73     return NGX_OK;
 74 }

Что я не понимаю, так это то, что после копирования переменных среды в блок, выделенный ngx_alloc(size, log);, как этот блок связан с блоком argv[]?

Я не вижу такой логики там.

И есть одна строка, которую я не понимаю:

ngx_os_argv_last--;

Для чего это линия, соединяющая выделенный блок с argv[]?

1 Ответ

1 голос
/ 01 июня 2011

Комментарий в начале модуля, кажется, многое объясняет, вы читали его?

http://lxr.evanmiller.org/http/source/os/unix/ngx_setproctitle.c#L14

Похоже, что функция ngx_init_setproctitle() просто устанавливает память для установки заголовка процесса и не вносит реальных изменений в заголовок. Комментарий в начале модуля гласит, что ему нужно настроить память для установки заголовка процесса, потому что argv [0] может не иметь места для нового заголовка (что необходимо установить для изменения заголовка) .

Переменная ngx_os_argv_last просто указывает на конец непрерывного фрагмента для argv[] и environ[]. Он используется позже в процессе копирования в ngx_setproctitle(). Последний ngx_os_argv_last--, вероятно, должен учитывать '\0' в конце строки.

ngx_init_setproctitle() создает пространство с помощью ngx_alloc(), затем копирует environ[] в новое пространство. Функция ngx_setproctitle() просто копирует ngx_os_argv[0] с новым значением title.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...