Путешествие к центру ядра j1m (j1m@list.ru) Хакер, номер #081, стр. 081-104-1 Исследуем виртуальную файловую систему procfs В то время, как в других операционных системах для предоставления пользователю возможности контролировать работу ядра, а также для получения доступа к системной статистики с подробной информацией о процессах, железе, сети требуется великое множество разнообразных программ, в Linux все это достигается чрезвычайно простым путем - с помощью файловой системы /proc. Как раз о procfs и пойдет речь в этой статье. [общие сведения о procfs] В первую очередь виртуальная файловая система procfs предназначена для получения информации о запущенных процессах - имя, уникальный идентификатор, отведенная память и т.д. В Linux она так же обеспечивает пользователя информацией о железе, файловых системах, предоставляет доступ к системной статистике, а также позволяет изменять некоторые параметры ядра "на лету". Что интересно, procfs не существует ни на физическом диске, ни в оперативной памяти. Когда происходит обращение к какому-либо из файлов, который находится в каталоге /proc (именно к нему обычно монтируется эта ФС), ядру передается соответствующее сообщение и оно, в ответ, отдает необходимую информацию. Таким образом, создается иллюзия работы с настоящей ФС, расположенной на жестком диске. С procfs работает очень большое количество программ, поэтому она является жизненно важной для любого Linux-дистрибутива. [процессы в разрезе] Раз уж procfs задумывалась как "файловая система процессов", то и начнем именно с этой функции. Если ты заглянешь в каталог /proc, то увидишь множество каталогов с именами, состоящими только из цифр. Такое имя указывает на PID процесса и содержит информацию, относящуюся к процессу с этим идентификатором. Например, информацию о процессе init, который всегда имеет PID равный единице, можно найти в каталоге /proc/1. Есть еще один специальный элемент каталога, относящийся к процессам: /proc/self. Это ссылка указывает на процесс, в данный момент работающий с каталогом /proc. Теперь разберемся с содержимым таких каталогов. Первый файл, на который следует обратить внимание: cmdline. Это строка запуска процесса, т.е. имя программы и аргументы. Если этот файл ничего не содержит, значит процесс находится в swap или превратился в зомби. Так же в каталоге находится ссылка с именем exe, указывающая на исполняемый файл, при запуске которого был порожден процесс. Таким образом, можно запустить копию процесса. Еще две ссылки root и cwd указывают на корень файловой системы и текущий рабочий каталог процесса. Очень полезным может оказаться содержимое файла environ, в нем ты найдешь окружение процесса (унаследованные переменные окружения). Обрати внимание, что строки файла разделены не символом новой строки, а нулевым символом (знающие Си поймут, почему так сделано). Поэтому, чтобы представить содержимое файла в удобочитаемом виде, придется выполнить такую команду: # cat /proc/PID/environ | tr "\0" "\n" | less Если уж говорить об окружении процессов, то следует упомянуть и о каталоге fd, который содержит ссылки на файлы, открытые процессом. Имя ссылки представляет собой файловый дескриптор. Как известно, файловые дескрипторы 0, 1 и 2 любого процесса представляют собой стандартные потоки ввода, вывода и вывода ошибок. Поэтому для обычной консольной программы все три файла будут ссылаться на терминальное устройство (/dev/vc/* для консоли и /dev/pts/* для xterm). В случае с демонами файлы будут указывать либо на /dev/null, либо вообще будут отсутствовать (если программа закрыла файловые дескрипторы). Зная вышеизложенное, можно проделывать интересные трюки, например, перенаправлять вывод программы на ее поток ввода: |