Управление процессами под Linux
Под Linux-ом для управления процессом поддерживается системный вызов ptrace, работающий так же, как 4.3BSD. Для получения информации о процессе или системе Linux также предоставляет файловую систему /proc, но с совершенно другой семантикой. Под Linux-ом /proc состоит из ряда файлов с общесистемной информацией, такой как использование памяти, средняя загруженность, статистика загружаемых модулей и сетевая статистика. Эти файлы общедоступны для read и write; их содержимое можно разбирать, используя scanf. Файловая система /proc под Linux-ом также предоставляет точку входа в директорию для каждого работающего процесса, называемую ID процесса. Она содержит файловые точки входа для информации типа командной линии, связей с текущей директорией и исполняемым файлом, открытых файловых дескрипторов и т.д. Ядро предоставляет всю эту информацию в ответ на запрос read. Такая реализация не противопоставляется файловой системе /proc, находящейся в Plan 9, и имеет некоторые ее недостатки. Например, для ps, чтобы просмотреть таблицу с информацией о всех работающих процессах, нужно пересечь многие директории, открыть и прочитать многие файлы. Для сравнения: подпрограммы kvm в других UNIX-системах считывают структуры ядра напрямую, потратив лишь несколько системных вызовов.
Очевидно, все реализации настолько различны, что перенос приложений, их использующих, может стать серьезной задачей. Следует особо отметить, что файловая система /proc в SVR4 намного грубее, чем в Linux-е, и их нельзя использовать в одно и том же контексте. Насамом деле каждая программа, которая использует kvm или файловую систему /proc SVR4, просто непереносима, и такие фрагменты кода должны быть переписаны.
Вызовы ptrace Linux-а и BSD похожи, но все же имеют несколько отличий:
- Запросы PTRACE_PEEKUSER и PTRACE_POKEUSER под BSD названы соответственно PTRACE_PEEKUSR и PTRACE_POKEUSR в Linux-е.
- Регистры процесса могут быть установлены с использованием запроса PTRACE_POKEUSR со смещениями, находящимися в /usr/include/linux/ptrace.h.
- Запросы SunOS-а PTRACE_{READ,WRITE}{TEXT,DATA} не поддерживаются, как не поддерживаются ни PTRACE_SETACBKPT, ни PTRACE_SETWRBKPT, ни PTRACE_CLRBKPT, ни PTRACE_DUMPCORE. Отсутствие этих запросов влияет лишь на малое количество существующих программ.
Linux не имеет подпрограмм kvm для чтения адресного пространства ядра из пользовательской программы, но в нем есть средства, такие как kmem_ps, в действительности являющиеся версией подобных подпрограмм. Вообще говоря, они непереносимы, и каждый код, использующий kvm, вероятнее всего, зависит от определенных обозначений или от типов данных ядра, поэтому такой код следует признать машинно-зависимым.