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

7.2.3. Переменные среды процесса.

Файл environ содержит список переменных среды, в которой работает процесс (см. раздел 2.1.6, "Среда выполнения"). Как и в случае файла cmdline, элементы списка разделяются нулевыми символами. Формат элемента таков: ПЕРЕМЕННАЯ=значение.

Представленная в листинге 7.4 программа является обобщением программы, которая была показана в листинге 2.3. В данном случае программа принимает в командной строке идентификатор процесса и отображает список его переменных среды, извлекаемый из файловой системы /proc.

Листинг 7.4. (print-environment.c) Отображение переменных среды процесса.

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

/* Вывод переменных среды (по одной в строке) процесса.

   с заданным идентификатором. */

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;

}