Книга: Программирование для Linux. Профессиональный подход

Листинг 7.3. (print-arg-list.c) Отображение списка аргументов указанного процесса

Листинг 7.3. (print-arg-list.c) Отображение списка аргументов указанного процесса

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
/* Вывод списка аргументов (по одному в строке) процесса
   с заданным идентификатором. */
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] = '';
 /* Перебор аргументов. Аргументы отделяются друг от друга
    нулевыми символами. */
 next_arg = arg_list;
 while (next_arg < arg_list + length) {
  /* Вывод аргументов. Каждый из них оканчивается нулевым
     символом и потому интерпретируется как обычная строка. */
  printf("%sn", 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.

Оглавление книги


Генерация: 3.174. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз