Программирование для Linux. Профессиональный подход
Шрифт:
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 <limits.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/* Нахождение путевого имени текущего исполняемого файла.
путевое имя помещается в строку 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);
}
int main {
char path[PATH_MAX];
get_executable_path(path, sizeof (path));
printf("this program is in the directory %e\n", path);
return 0;
}
7.2.5. Дескрипторы файлов процесса
Элемент
fd
файловой системы /proc
— это подкаталог, в котором содержатся записи обо всех файлах, открытых процессом. Каждая запись представляет собой символическую ссылку на файл или устройство. Через эти ссылки можно осуществлять чтение и запись данных. Имена ссылок соответствуют номерам дескрипторов. Рассмотрим небольшой трюк. Откройте новое терминальное окно и найдите с помощью команды
ps
идентификатор процесса, соответствующий интерпретатору команд: % ps
PID TTY TIME CMD
1261 pts/4 00:00:00 bash
2455 pts/4 00:00:00 ps
В данном случае процесс идентификатора команд (
bash
) имеет идентификатор 1261. Теперь откройте второе окно и просмотрите содержимое подкаталога fd
этого процесса: % ls -l /proc/1261/fd total 0
lrwx------ 1 samuel samuel 64 Jan 30 01:02 0 -> /dev/pts/4
lrwx------ 1 samuel samuel 64 Jan 30 01:02 1 -> /dev/pts/4
lrwx------ 1 samuel samuel 64 Jan 30 01:02 2 -> /dev/pts/4
(В выводе могут присутствовать дополнительные строки, соответствующие другим открытым файлам.) Вспомните в разделе 2.1.4, "Стандартный ввод-вывод", рассказывалось о том. что дескрипторы 0, 1 и 2 закрепляются за стандартными потоками ввода, вывода и ошибок соответственно. Таким образом, при записи в файл
/proc/1261/fd/1
данные будут направляться в устройство, связанное с потоком stdout
интерпретатора команд, т.е. на псевдотерминал первого окна. Попробуйте ввести следующую команду % echo "Hello, world." >> /proc/1261/fd/1
Сообщение "Hello, world." появится в первом окне.
В подкаталоге
fd
могут присутствовать ссылки и на другие файлы. В листинге 7.6 показана программа, которая открывает файл, указанный в командной строке, и переходит в бесконечный цикл. Листинг 7.6. (open-and-spin.c) Открытие файла для чтения
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
const char* const filename = argv[1];
int fd = open(filename, O_RDONLY);
printf("in process %d, file descriptor %d is open to %s\n",
(int)getpid, (int)fd, filename);
while (1);
return 0;
Поделиться:
Популярные книги
Я снова царь. Книга XXXIII
33. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я С СССР! Том III
3. Я спас СССР
Фантастика:
альтернативная история
5.86
рейтинг книги
Deus vult
3. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Курс 1. Сентябрь
1. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Мастер 3
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Одержимая (авторский сборник)
Фантастика:
фэнтези
научная фантастика
7.80
рейтинг книги
Воин-Врач
1. Воин-Врач
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
6.00
рейтинг книги
История США от глубокой древности до 1918 года
Популярная наука от Азимова
Научно-образовательная:
история
5.00
рейтинг книги
Законник Российской Империи. Том 2
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Господин из завтра. Тетралогия.
Фантастика:
альтернативная история
8.32
рейтинг книги
Меткий стрелок
1. Меткий стрелок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Родословная. Том 1
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Солдат Империи
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Вечный. Книга I
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00