Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Наберите в своей оболочке следующую команду:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
$ ps -e
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
На экран будут выведен список всех работающих в системе процессов. Если хотите посчитать количество процессов, наберите что-нибудь, наподобие этого:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
$ ps -e --no-headers | nl | tail -n 1
74 4650 pts/0 00:00:00 tail
$
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Первое число - это количество работающих в системе процессов. Пользователи KDE могут воспользоваться программой kpm, а пользователи Gnome - программой gnome-system-monitor для получения информации о процессах. На то он и Linux, чтобы позволять пользователю делать одно и то же разными способами.
Возникает вопрос: "Что такое процесс?". Процессы в Linux, как и файлы, являются аксиоматическими понятиями. Иногда процесс отождествляют с запущенной программой, однако, это не всегда так. Будем считать, что процесс - это рабочая единица системы, которая выполняет что-то. Многозадачность - это возможность одновременного сосуществования нескольких процессов в одной системе.
Linux - многозадачная операционная система. Это означает, что процессы в ней работают одновременно. Естественно, это условная формулировка. Ядро Linux постоянно переключает процессы, то есть время от времени дает каждому из них сколько-нибудь процессорного времени. Переключение происходит довольно быстро, поэтому нам кажется, что процессы работают одновременно.
Одни процессы могут порождать другие процессы, образовывая древовидную структуру. Порождающие процессы называются родителями или родительскими процессами, а порожденные - потомками или дочерними процессами. На вершине этого "дерева" находится процесс init, который порождается автоматически ядром в процессе загрузки системы.
К каждому процессу в системе привязана пара целых неотрицательных чисел: идентификатор процесса PID (Process IDentifier) и идентификатор родительского процесса PPID (Parent Process IDentifier). Для каждого процесса PID является уникальным (в конкретный момент времени), а PPID равен идентификатору процесса-родителя. Если ввести в оболочку команду ps -ef, то на экран будет выведен список процессов со значениями их PID и PPID (вторая и третья колонки соотв.). Пример работы такой команды:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:08? 00:00:00 /sbin/init
root 2 0 0 17:08? 00:00:00 [kthreadd]
root 3 2 0 17:08? 00:00:00 [migration/0]
root 4 2 0 17:08? 00:00:00 [ksoftirqd/0]
root 5 2 0 17:08? 00:00:00 [watchdog/0]
root 6 2 0 17:08? 00:00:00 [migration/1]
root 7 2 0 17:08? 00:00:00 [ksoftirqd/1]
root 8 2 0 17:08? 00:00:00 [watchdog/1]
root 9 2 0 17:08? 00:00:00 [events/0]
root 10 2 0 17:08? 00:00:00 [events/1]
root 11 2 0 17:08? 00:00:00 [cpuset]
root 12 2 0 17:08? 00:00:00 [khelper]
root 13 2 0 17:08? 00:00:00 [netns]
root 14 2 0 17:08? 00:00:00 [async/mgr]
root 15 2 0 17:08? 00:00:00 [kintegrityd/0]
root 16 2 0 17:08? 00:00:00 [kintegrityd/1]
root 17 2 0 17:08? 00:00:00 [kblockd/0]
root 18 2 0 17:08? 00:00:00 [kblockd/1]
root 19 2 0 17:08? 00:00:00 [kacpid]
…
df00 16389 16387 0 20:10 pts/1 00:00:00 /bin/bash
df00 17446 2538 0 20:26? 00:00:00 [nautilus] <defunct>
df00 18544 2932 0 20:41 pts/2 00:00:00 /bin/bash -l
df00 19010 18544 0 20:48 pts/2 00:00:00 ps -ef
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Надо отметить, что процесс init всегда имеет идентификатор 1 и PPID равный 0. Хотя в реальности процесса с идентификатором 0 не существует. Дерево процессов можно также представить в наглядном виде при помощи опции --forest программы ps:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
PIDTTYTIMECMD
2? 00:00:00 kthreadd
3?00:00:00 \_ migration/0
4?00:00:00 \_ ksoftirqd/0
5?00:00:00 \_ watchdog/0
6?00:00:00 \_ migration/1
7?00:00:00 \_ ksoftirqd/1
8?00:00:00 \_ watchdog/1
9?00:00:00 \_ events/0
10?00:00:00 \_ events/1
11?00:00:00 \_ cpuset
12?00:00:00 \_ khelper
13?00:00:00 \_ netns
14?00:00:00 \_ async/mgr
15?00:00:00 \_ kintegrityd/0
16?00:00:00 \_ kintegrityd/1
….
18544 pts/2 00:00:00 \_ bash
16388?00:00:00 \_ gnome-pty-helpe
16389 pts/1 00:00:00 \_ bash
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Если вызвать программу ps без аргументов, то будет выведен список процессов, принадлежащих текущей группе, то есть работающих под текущим терминалом.
Использование getpid() и getppid()
Процесс может узнать свой идентификатор (PID), а также родительский идентификатор (PPID) при помощи системных вызовов getpid() и getppid().
Системные вызовы getpid() и getppid() имеют следующие прототипы:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
pid_t getpid (void);
pid_t getppid (void);
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Для использования getpid() и getppid() в программу должны быть включены директивой #include заголовочные файлы unistd.h и sys/types.h (для типа pid_t). Вызов getpid() возвращает идентификатор текущего процесса (PID), а getppid() возвращает идентификатор родителя (PPID). pid_t - это целый тип, размерность которого зависит от конкретной системы. Значениями этого типа можно оперировать как обычными целыми числами типа int.
Рассмотрим теперь простую программу, которая выводит на экран PID и PPID, а затем "замирает" до тех пор, пока пользователь не нажмет <Enter>.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/* getpid.c */
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main (void)
{
pid_t pid, ppid;
pid = getpid ();
ppid = getppid ();
printf ("PID: %d\n", pid);
printf ("PPID: %d\n", ppid);
fprintf (stderr, "Press <Enter> to exit...");
getchar ();
return 0;
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Проверим теперь, как работает эта программа. Для этого откомпилируем и запустим ее:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
$ gcc -o getpid getpid.c
$./getpid
PID: 19724
PPID: 19702
Press <Enter> to exit...
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Теперь, не нажимая <Enter>, откроем другое терминальное окно и проверим, правильность работы системных вызовов getpid() иgetppid():
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
$ ps -ef | grep getpid
df00 19724 19702 0 20:58 pts/3 00:00:00./main
df00 19856 18544 0 21:00 pts/2 00:00:00 grep --colour=auto main
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Дата публикования: 2014-11-29; Прочитано: 256 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!