Файл cmdline
в файловой системе /proc содержит список аргументов процесса (см. раздел 2.1.1. "Список аргументов"). Этот список представлен одной строкой, в которой аргументы отделяются друг от друга нулевыми символами. Большинство функций работы со строками предполагает, что нулевым символом оканчивается вся строка, поэтому они не смогут правильно обработать файл cmdline
.
В листинге 2.1 приводилась программа, которая отображала переданный ей список аргументов. Теперь, когда мы узнали назначение файлов cmdline
файловой системы /proc
, можно написать программу, отображающую список аргументов другого процесса. Ее текст показан в листинге 7.3. Поскольку в строке файла cmdline
может содержаться несколько нулевых символов, ее длину нельзя определить с помощью функции strlen()
(она лишь подсчитывает число символов, пока не встретится нулевой символ). Приходится полагаться на функцию read()
, которая возвращает число прочитанных байтов.
#include
#include
#include
#include
#include
#include
/* Вывод списка аргументов (по одному в строке) процесса
с заданным идентификатором. */
void print_process_arg_list(pid_t pid) {
int fd;
char filename[24];
char arg_list[1024];
size_t length;
char* next_arg;
/* Определение полного имени файла cmdline
для заданного процесса. */
snprintf(filename, sizeof(filename), "/proc/%d/cmdline",
(int)pid);
/* Чтение содержимого файла. */
fd = open(filename, O_RDONLY);
length = read(fd, arg_list, sizeof(arg_list));
close(fd);
/* Функция read() не помещает в конец текста нулевой символ,
поэтому его приходится добавлять отдельно. */
arg_list[length] = '\0';
/* Перебор аргументов. Аргументы отделяются друг от друга
нулевыми символами. */
next_arg = arg_list;
while (next_arg < arg_list + length) {
/* Вывод аргументов. Каждый из них оканчивается нулевым
символом и потому интерпретируется как обычная строка. */
printf("%s\n", next_arg);
/* Переход к следующем аргументу. Поскольку каждый аргумент
заканчивается нулевым символом, функция strlen() вычисляет
длину отдельного аргумента, а не всего списка. */
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
.
#include
#include
#include
#include
#include
#include
/* Вывод переменных среды (по одной в строке) процесса
с заданным идентификатором. */
void print_process_environment(pid_t pid) {
int fd;
char filename[24];