длину отдельного аргумента, а не всего списка. */
next_arg += strlen(next_arg) + 1;
}
}
int main(int argc, char* argv[]) {
pid_t pid = (pid_t)atoi(argv[1]);
print_process_arg_list(pid);
return 0;
}
Предположим, к примеру, что номер процесса системного демона syslogd
равен 372.
% ps 372
PID TTY STAT TIME COMMAND
372 ? S 0:00 syslogd -m 0
% ./print-arg-list 372
syslogd
-m
0
В данном случае программа print-arg-list
, сообщает о том, что демон syslogd
вызван с аргументами -m 0
.
7.2.3. Переменные среды процесса
Файл environ
содержит список переменных среды, в которой работает процесс (см. раздел 2.1.6, "Среда выполнения"). Как и в случае файла cmdline
, элементы списка разделяются нулевыми символами. Формат элемента таков: ПЕРЕМЕННАЯ = значение
.
Представленная в листинге 7.4 программа является обобщением программы, которая была показана в листинге 2.3. В данном случае программа принимает в командной строке идентификатор процесса и отображает список его переменных среды, извлекаемый из файловой системы /proc
.
Листинг 7.4. ( print-environment.c ) Отображение переменных среды процесса
#include
#include
#include
#include
#include
#include
/* Вывод переменных среды (по одной в строке) процесса
с заданным идентификатором. */
void print_process_environment(pid_t pid) {
int fd;
char filename[24];
char environment[8192];
size_t length;
char* next_var;
/* Определение полного имени файла environ
для заданного процесса. */
snprintf(filename, sizeof(filename), "/proc/%d/environ",
(int)pid);
/* Чтение содержимого файла. */
fd = open(filename, O_RDONLY);
length = read(fd, environment, sizeof (environment));
close(fd);
/* Функция read() не помещает в конец текста нулевой символ,
поэтому его приходится добавлять отдельно. */
environment[length] = ' \0';
/* Перебор переменных. Элементы списка отделяются друг от друга
нулевыми символами. */
next_var = environment;
while (next_var < environment + length) {
/* Вывод элементов списка. Каждый из них оканчивается нулевым
символом и потому интерпретируется как обычная строка. */
printf("%s\n", next_var);
/* Переход к следующей переменной. Поскольку каждый элемент
списка заканчивается нулевым символом, функция strlen()
вычисляет длину отдельного элемента, а не всего списка. */
next_var += strlen(next_var) + 1;
}
}
int main(int argc, char* argv[]) {
pid_t pid = (pid_t)atoi(argv[1]);
print_process_environment(pid);
return 0;
}
7.2.4. Исполняемый файл процесса
Файл exe
указывает на исполняемый файл процесса. В разделе 2.1.1, "Список аргументов", говорилось о том, что имя исполняемого файла обычно передается в качестве первого элемента списка аргументов. Но это лишь распространенное соглашение. Программу можно запустить с произвольным списком аргументов. Файл exe
файловой системы /proc
— это более надежный способ узнать, какой исполняемый файл запущен процессом.
Во многих программах путь ко вспомогательным файлам задан относительно исполняемого файла, поэтому важно знать, где именно он находится. Функция get_executable_path()
в листинге 7.5 определяет путевое имя текущего исполняемого файла, проверяя символическую ссылку /proc/self/exe
.
Листинг 7.5. ( get-exe-path.c ) Определение путевого имени текущего исполняемого файла
#include
#include
#include
#include
/* Нахождение путевого имени текущего исполняемого файла.
путевое имя помещается в строку BUFFER, длина которой
равна LEN. Возвращается число символов в имени либо
-1 в случае ошибки. */
size_t get_executable_path(char* buffer, size_t len) {
char* path_end;
/* чтение содержимого символической ссылки /proc/self/exe. */
if (readlink("/proc/self/exe", buffer, len) <= 0)
return -1;
/* Нахождение последней косой черты, отделяющей путевое имя. */
path_end = strrchr(buffer, '/');
if (path_end == NULL)
return -1;
/* Переход к символу, стоящему за последней косой чертой. */
++path_end;
/* Усечение полной строки до путевого имени. */
*path_end = '\0';
/* Длина путевого имени — это число символов до последней
косой черты. */
return (size_t)(path_end - buffer);
Читать дальше