Управление процессами и нитями в ОС QNX. Основные принципы управления процессами и нитями в ОС QNX, страница 4

0    5754919    5750821  - 07:39 ?        00:00:00 son3

0    5759016    5754919  - 07:39 ?        00:00:00 sh -c sh

0    5759017    5759016  - 07:39 ?        00:00:00 ps -f

0    5759018    5759016  - 07:39 ?        00:00:00 tee -a fs_log.txt

# 3 example:

UID        PID       PPID  C STIME TTY          TIME CMD

0     335894          2  - Nov23 ?        00:00:00 login

0     561175     479263  - Nov23 ?        00:01:00 pterm

0     434203          1  - Nov23 ?        00:00:14 pwm

0     561180     561175  - Nov23 ?        00:00:01 /bin/sh

0     479263          1  - Nov23 ?        00:01:10 shelf

0     479263          1  - Nov23 ?        00:01:10 shelf

0     516128          1  - Nov23 ?        00:00:01 bkgdmgr

0     516129          1  - Nov23 ?        00:00:04 wmswitch

0     516130          1  - Nov23 ?        00:00:20 saver

0     561187     561180  - Nov23 ?        00:00:11 pfm

0    5656612     561180  - Nov23 ?        00:00:00 ./auto

0    5750821    5656612  - Nov23 ?        00:00:00 father3

0    5722150          1  - Nov23 ?        00:00:00 son2

0    5779496    5722150  - Nov23 ?        00:00:00 sh -c sh

0    5779497    5779496  - Nov23 ?        00:00:00 ps -f

0    5779498    5779496  - Nov23 ?        00:00:00 tee -a fs_log.txt

5754919     (Zombie)                                           

Пояснение:

# 2 example:

Родительский процесс, не ожидая завершения работы процесса-потомка, завершает свое выполнение, таким образом после уничтожения родительского процесса, у процесса-потомка появляется новый родительский процесс – процесс procnto (pid =1).

# 3 example:

Завершение процесса выполняется в две стадии.

- на первой стадии происходит “физическое” уничтожение процесса (закрываются открытые файлы, освобождается оперативная память и т.д.);

- на второй стадии уничтожается структура данных о процессе, хранящаяся в операционной системе.

Таким образом, после окончания первой стадии уничтожения процесса и до того, как родительский процесс вызвал функцию wait(), Администратор процессов не заканчивает вторую стадию уничтожения, а завершаемый процесс находится в состоянии “зомби”.

“Зомби” – процесс, который физически уже не существует, но его код завершения еще хранится в Администраторе процессов.

2.3.  Управление процессами посредством сигналов.

intkill(pid_tpid, intsig) – системный вызов, используемый для того, чтобы послать любой сигнал любому процессу или группе процессов.

Если pid больше 0, то сигнал sig посылается процессу pid.

Если pid равен 0, то сигнал sig посылается всем процессам текущей группы.

Если pid равен -1, то сигнал sig посылается всем процессам, кроме процесса 1 (init).

Если pid меньше -1, то сигнал sig посылается всем процессам группы -pid.

Если sig равен 0, то сигнал не посылается, но выполняется проверка на возникновение ошибок в процессе.

sighandler_tsignal(intsignum,sighandler_thandler) – системный вызов устанавливает новый обработчик сигнала с номером signum в соотвествии с sighandler, который может быть быть функцией пользователя, SIG_IGN или SIG_DFL. Использование функции-обработчика сигнала называется “перехватом сигнала”. Сигналы SIGKILL и SIGSTOP не могут быть перехвачены или игнорированы.

Примеры реакции процесса на посылаемый ему сигнал:

father.c

#include <sys/types.h>

#include <stdlib.h>

#include <process.h>

main()

{    

int i;

int pid[3];

if((pid[0]=fork())==0) execl("./son1","son1", NULL);

if((pid[1]=fork())==0) execl("./son2","son2", NULL);

if((pid[2]=fork())==0) execl("./son3","son3", NULL);

system("ps -f > ./sig_log.txt");

for ( i=0;i<3;i++)

{    

kill(pid[i], SIGUSR1);

}

system("ps -f >> ./sig_log.txt");

}

son1.cвыполнение действия по умолчанию на полученный сигнал( завершение).