Управление процессами и нитями. Выполнение системных вызовов fork(), execl(), wait(), exit(), sleep()

Страницы работы

Фрагмент текста работы

Системные ресурсы, связанные с дочерним процессом, освобождаются.

void _exit(int status) завершает вызвавший её процесс. Любые открытые файловые дескрипторы, принадлежащие данному процессу, закрываются; любые потомки данного процесса наследуются процессом init, который имеет идентификатор (номер) 1; а родительскому процессу, посылается сигнал SIGCHLD. Значение status возвращается родительскому процессу как код завершения процесса, и может быть затем получено при помощи вызова одной из функций семейства wait.

unsignedintsleep(unsignedintseconds)переводит текущий процесс в режим ожидания на seconds секунд.

2. Порождение и запуск процессов.

Напишем две программы father.c и son.c. Тексты программ приведены ниже.

Father.c:

#include <stdio.h>

#include <stdlib.h>

#include <sys/resource.h>

main()

{

int pid, ppid, status;

pid=getpid();

ppid=getppid();

printf("\n\n FATHER PARAM: pid=%i  ppid=%i \n", pid,ppid);

if(fork()==0) execl("son.out","son.out", NULL);

system("ps | grep \"out *$\" ");

wait(&status);

}

Son.c:

#include <stdio.h>

main()

{

int pid, ppid;

pid=getpid();

ppid=getppid();

printf("\n SON PARAM: pid=%i ppid=%i \n",pid,ppid);

sleep(15);

}

При выполнении команды ./f2.out >> log3.txt приходится ждать 15 секунд пока не завершится программа son. В результате получаем следуещее:

PID TTY          TIME CMD

401427 ?        00:00:00 pfm

315413 ?        00:00:01 pwm

163863 ?        00:00:00 login

163864 ?        00:00:00 login

163865 ?        00:00:00 login

241690 ?        00:00:00 login

344091 ?        00:00:02 shelf

3186718 ?        00:00:00 ./f2.out

364575 ?        00:00:00 bkgdmgr

364577 ?        00:00:00 wmswitch

364578 ?        00:00:00 saver

3190819 ?        00:00:00 son.out

3194916 ?        00:00:00 ps

471077 ?        00:00:01 pterm

471078 ?        00:00:00 /bin/sh

2957351 ?        00:00:00 pfm

2957352 ?        00:00:00 /usr/photon/bin/pterm

2957353 ?        00:00:00 /bin/sh

2957354 ?        00:00:00 ped

3100715 ?        00:00:00 /usr/photon/bin/pterm

3100716 ?        00:00:00 /bin/sh

3100717 ?        00:00:00 ped

3190830 ?        00:00:00 sh

SON PARAM: pid=3190819 ppid=3186718

FATHER PARAM: pid=3186718  ppid=471078

Среди списка процессов можно выделить наши процессы f2.out и son.out. Причём ppid процесса son совпадает с pid процесса father. ppid процесса father овпадает с pid процесса /bin/sh. Оно и понятно, ведь процесс father мы запустили из терминала командой ./f2.out. Если запустить процесс father в фоновом режиме, можно не дожидаясь его окончания запускать другие процессы. Например, запустим 2 раза подряд наш процесс father. В результате в списке процессов имеем по 2 процесса father и son с разными pid.

./f2.out &

[1] 3489838

#

FATHER PARAM: pid=3489838  ppid=3485732

SON PARAM: pid=3493935 ppid=3489838

PID TTY          TIME CMD

401427 ?        00:00:00 pfm

315413 ?        00:00:02 pwm

163863 ?        00:00:00 login

163864 ?        00:00:00 login

163865 ?        00:00:00 login

241690 ?        00:00:00 login

344091 ?        00:00:02 shelf

3481630 ?        00:00:00 script

364575 ?        00:00:00 bkgdmgr

364577 ?        00:00:00 wmswitch

364578 ?        00:00:00 saver

3485731 ?        00:00:00 script

3485732 ?        00:00:00 /bin/sh

471077 ?        00:00:01 pterm

471078 ?        00:00:00 /bin/sh

2957351 ?        00:00:00 pfm

2957352 ?        00:00:00 /usr/photon/bin/pterm

2957353 ?        00:00:00 /bin/sh

2957354 ?        00:00:01 ped

3100715 ?        00:00:00 /usr/photon/bin/pterm

3100716 ?        00:00:00 /bin/sh

3100717 ?        00:00:00 ped

   3489838 ?        00:00:00 ./f2.out

   3493935 ?        00:00:00 son.out

3498032 ?        00:00:00 ps

3493937 ?        00:00:00 sh

# ./f2.out &

[2] 3510320

#

FATHER PARAM: pid=3510320  ppid=3485732

SON PARAM: pid=3514417 ppid=3510320

PID TTY          TIME CMD

401427 ?        00:00:00 pfm

315413 ?        00:00:02 pwm

163863 ?        00:00:00 login

163864 ?        00:00:00 login

163865 ?        00:00:00 login

241690 ?        00:00:00 login

344091 ?        00:00:02 shelf

3481630 ?        00:00:00 script

364575 ?        00:00:00 bkgdmgr

364577 ?        00:00:00 wmswitch

364578 ?        00:00:00 saver

3485731 ?        00:00:00 script

3485732 ?        00:00:00 /bin/sh

471077 ?        00:00:01 pterm

471078 ?        00:00:00 /bin/sh

2957351 ?        00:00:00 pfm

2957352 ?        00:00:00 /usr/photon/bin/pterm

2957353 ?        00:00:00 /bin/sh

2957354 ?        00:00:01 ped

3100715 ?        00:00:00 /usr/photon/bin/pterm

3100716 ?        00:00:00 /bin/sh

3100717 ?        00:00:00 ped

3489838 ?        00:00:00 ./f2.out

   3493935 ?        00:00:00 son.out

   3510320 ?        00:00:00 ./f2.out

   3514417 ?        00:00:00 son.out

3518514 ?        00:00:00 ps

3514419 ?        00:00:00 sh

[2] + Done (49)            ./f2.out

[1] - Done (47)            ./f2.out

3. Взаимодействие родственных процессов.

1.         Процесс-отец запускает процесс-сын и ожидает его завершения.

Содержимое файла f.c:

#include <stdio.h>

#include <stdlib.h>

#include <sys/resource.h>

main()

{

int pid, ppid, status;

pid=getpid();

ppid=getppid();

printf("\n\n FATHER PARAM: pid=%i  ppid=%i \n", pid,ppid);

if(fork()==0) execl("son.out","son.out", NULL);

system("ps -f");

wait(&status);

}

Результат работы программы:

# ./f.out

FATHER PARAM: pid=1404979  ppid=1400882

SON PARAM: pid=1409076 ppid=1404979

PID TTY          TIME CMD

401427 ?        00:00:00 pfm

417813 ?        00:00:00 pfm

163863 ?        00:00:00 login

163864 ?        00:00:00 login

163865 ?        00:00:00 login

241690 ?        00:00:00 login

417819 ?        00:00:00 /usr/photon/bin/pterm

417822 ?        00:00:00 /bin/sh

307231 ?        00:00:00 pwm

335905 ?        00:00:01 shelf

356386 ?        00:00:00 bkgdmgr

356387 ?        00:00:00 wmswitch

356388 ?        00:00:00 saver

417829 ?        00:00:00 ped

458790 ?        00:00:01 pterm

458791 ?        00:00:00 /bin/sh

921640 ?        00:00:00 /usr/photon/bin/pterm

471081 ?        00:00:00 script

471082 ?        00:00:00 /bin/sh

1392683 ?        00:00:00 /usr/photon/bin/pterm

921644 ?        00:00:00 /bin/sh

921645 ?        00:00:00 ped

1392686 ?        00:00:00 /bin/sh

1392687 ?        00:00:00 ped

1396784 ?        00:00:00 script

1400881 ?        00:00:00 script

1400882 ?        00:00:00 /bin/sh

1404979 ?        00:00:00 ./f.out

1409076 ?        00:00:00 son.out

1413173 ?        00:00:00 ps

1409078 ?        00:00:00 sh

2. Процесс-отец завершает процесс-сын, и не ожидая его завершения, завершает своё выполнение. Содержимое файла f2.c:

#include <stdio.h>

#include <stdlib.h>

#include <sys/resource.h>

main()

{

int pid, ppid, status;

pid=getpid();

ppid=getppid();

printf("\n\n FATHER PARAM: pid=%i  ppid=%i \n", pid,ppid);

if(fork()==0) execl("son2.out","son2.out", NULL);

system("ps -f");

}

После завершения родительского процесса (процесс-сын выполняется) имеем следующую таблицу процесов:

UID        PID       PPID  C STIME TTY          TIME CMD

0     401427     335905  - Dec16 ?        00:00:01 pfm

0     417813     335905  - Dec16 ?        00:00:00 pfm

0     163863          2  - Dec16 ?        00:00:00 login

0     163864          2  - Dec16 ?        00:00:00 login

0     163865          2  - Dec16 ?        00:00:00 login

0     241690          2  - Dec16 ?        00:00:00 login

0     417819     417813  - Dec16 ?        00:00:00 /usr/photon/bin/pterm -U

0     417822     417819  - Dec16 ?        00:00:00 /bin/sh -c /bin/sh

0     307231          1  - Dec16 ?        00:00:01 pwm

0     335905          1  - Dec16 ?        00:00:01 shelf

0     335905          1  - Dec16 ?        00:00:01 shelf

0     356386          1  - Dec16 ?        00:00:00 bkgdmgr

0     356387          1  - Dec16 ?        00:00:00 wmswitch

0     356388          1  - Dec16 ?        00:00:00 saver

0     417829     417822  - Dec16 ?        00:00:01 ped rep_3

0     458790     335905  - Dec16 ?        00:00:01 pterm

0     458791     458790  - Dec16 ?        00:00:00 /bin/sh

0     921640     401427  - Dec16 ?        00:00:00 /usr/photon/bin/pterm -U

0     471081          1  - Dec16 ?        00:00:00 script

0     471082     471081  - Dec16 ?        00:00:00 /bin/sh /bin/sh

0    1392683     401427  - Dec16 ?        00:00:00 /usr/photon/bin/pterm -U

0     921644     921640  - Dec16 ?        00:00:00 /bin/sh -c /bin/sh

0     921645     921644  - Dec16 ?        00:00:00 ped f2.c

0    1392686    1392683  - Dec16 ?        00:00:00 /bin/sh -c /bin/sh

0    1392687    1392686  - Dec16 ?        00:00:00 ped typescript

0    1396784     458791  - Dec16 ?        00:00:00 script

0    1400881    1396784  - Dec16 ?        00:00:00 script

0    1400882    1400881  - Dec16 ?        00:00:00 /bin/sh /bin/sh

0    1511475    1400882  - Dec16 ?        00:00:00 ps -f

0    1490996          1  - Dec16 ?        00:00:00 son2.out

Как видно, PPID процесса son2.out стал 1, так как родительский процесс завершился.

3. Процесс-отец запускает процесс-сын и ожидает его завершения. Процесс-сын завершает своё выполнение.        Содержимое файла f3.c преведено ниже:

#include <stdio.h>

#include <stdlib.h>

#include <sys/resource.h>

main()

{

int pid, ppid, status;

pid=getpid();

ppid=getppid();

printf("\n\n FATHER PARAM: pid=%i  ppid=%i \n", pid,ppid);

if(fork()==0) execl("son3.out","son3.out", NULL);

system ("pidin");

}

В результате получаем следующую таблицу процессов, в которой виден процесс-зомби.

FATHER PARAM: pid=1523763  ppid=1400882

SON PARAM: pid=1527860 ppid=1523763

pid tid name               prio STATE       Blocked                    

1   1 boot/procnto-instr   0f READY                                  

1   2 boot/procnto-instr 255r RECEIVE     1                          

1   3 boot/procnto-instr 255r RECEIVE     1                          

1   4 boot/procnto-instr  10r RUNNING                                

1   5 boot/procnto-instr 255r RECEIVE     1                          

1   6 boot/procnto-instr  12r RECEIVE     1                          

1   7 boot/procnto-instr  10r RECEIVE     1                           

1   8 boot/procnto-instr  10r RECEIVE     1                          

1   9 boot/procnto-instr  10r RECEIVE     1                          

1  10 boot/procnto-instr  10r RECEIVE     1                          

1  12 boot/procnto-instr  10r RECEIVE     1                          

1  15 boot/procnto-instr  10r RECEIVE     1                          

2   1 sbin/tinit          10o REPLY       1                          

4099   1 proc/boot/pci-bios  12o RECEIVE     1                          

4100   1 proc/boot/slogger   10o RECEIVE     1                          

4101   1 proc/boot/io-usb    10o SIGWAITINFO                            

4101   2 proc/boot/io-usb    21r RECEIVE     4                          

4101   3 proc/boot/io-usb    21r RECEIVE     7                          

4101   4 proc/boot/io-usb    21r RECEIVE     10                         

4101   5 proc/boot/io-usb    21r RECEIVE     1                           

4101   6 proc/boot/io-usb    10o RECEIVE     13                         

4101   7 proc/boot/io-usb    10r READY                                  

4101   8 proc/boot/io-usb    10o RECEIVE     13                         

4102   1 proc/boot/io-hid    10o SIGWAITINFO                            

4102   2 proc/boot/io-hid    21r RECEIVE     1                          

4102   3 proc/boot/io-hid    10o RECEIVE     4                          

4102   5 proc/boot/io-hid    10r REPLY       4101                       

4102   6 proc/boot/io-hid    15r RECEIVE     12                         

4102   7 proc/boot/io-hid    15r RECEIVE     16                         

4102   8 proc/boot/io-hid    10o RECEIVE     4                           

4103   1 /boot/devc-con-hid  20o RECEIVE     1                          

4103   2 /boot/devc-con-hid  10o REPLY       4102                       

8200   1 roc/boot/devb-eide  10o SIGWAITINFO                            

8200   2 roc/boot/devb-eide  21r RECEIVE     1                          

8200   3 roc/boot/devb-eide  21r RECEIVE     4                          

8200   4 roc/boot/devb-eide  10o RECEIVE     10                         

8200   5 roc/boot/devb-eide  10o RECEIVE     7                          

8200   6 roc/boot/devb-eide  10o RECEIVE     7                          

8200   7 roc/boot/devb-eide  10o RECEIVE     7                          

8200   8 roc/boot/devb-eide  10o RECEIVE     7                          

8200  13 roc/boot/devb-eide  10o RECEIVE     7                          

20489   1 sbin/pipe           10o SIGWAITINFO                            

20489   2 sbin/pipe           10o RECEIVE     1                           

20489   3 sbin/pipe            9o RECEIVE     1                          

20489   4 sbin/pipe           10o RECEIVE     1                          

24586   1 sbin/mqueue         10o RECEIVE     1                          

53259   1 usr/sbin/mcd        10o RECEIVE     1                          

53259   2 usr/sbin/mcd        10o NANOSLEEP                              

53259   3 usr/sbin/mcd        10o SIGWAITINFO                            

53259   4 usr/sbin/mcd         9o READY                                  

53259   5 usr/sbin/mcd        10o SIGWAITINFO                            

53259   6 usr/sbin/mcd        10o SIGWAITINFO                            

53259   7 usr/sbin/mcd        10o SIGWAITINFO                             

57356   1 usr/sbin/random     10o SIGWAITINFO                            

57356   2 usr/sbin/random     10o RECEIVE     1                          

57356   3 usr/sbin/random     10o NANOSLEEP                              

61453   1 sbin/enum-devices   10o REPLY       20489                      

77840   1 sbin/enum-usb       10o SIGWAITINFO                            

77840   2 sbin/enum-usb       10r REPLY       4101                       

94222   1 sbin/devp-pccard    21o RECEIVE     1                          

94223   1 sbin/enum-pccard    29f RECEIVE     1                          

98321   1 sbin/io-display     10o SIGWAITINFO                            

98321   2 sbin/io-display     12o RECEIVE     1                          

98321   3 sbin/io-display     12o RECEIVE     1                          

98321   4 sbin/io-display     10o RECEIVE     3                          

98321   5 sbin/io-display     10o RECEIVE     1                           

98321   6 sbin/io-display     12o RECEIVE     1                          

114706   1 sbin/io-pkt-v4-hc   21o SIGWAITINFO                            

114706   2 sbin/io-pkt-v4-hc   21o RECEIVE     1                          

114706   3 sbin/io-pkt-v4-hc   10r RECEIVE     16                         

135188   1 sbin/devc-pty       10o RECEIVE     1                          

147478   1 usr/sbin/dumper     10o RECEIVE     1                          

163863   1 bin/login           10o REPLY       4103                       

163864   1 bin/login           10o REPLY       4103                       

163865   1 bin/login           10o REPLY       4103                       

192540   1 /photon/bin/Photon  12r RECEIVE     1                           

213021   1 on/bin/io-graphics  12r CONDVAR     (0x805cf7c)                

213021   2 on/bin/io-graphics  10r RECEIVE     1                          

213021   3 on/bin/io-graphics  12r REPLY       192540                      

229408   1 hoton/bin/devi-hid  10o RECEIVE     1                          

229408   2 hoton/bin/devi-hid  10o REPLY       4102                       

229408   3 hoton/bin/devi-hid  12o SIGWAITINFO                            

229408   5 hoton/bin/devi-hid  10o RECEIVE     1                          

241690   1 bin/login           10o REPLY       4103                       

307231   1 usr/photon/bin/pwm  10r RECEIVE     1                          

335905   1 r/photon/bin/shelf  10r CONDVAR     (0x8075558)                

335905   2 r/photon/bin/shelf  10r RECEIVE     1                          

356386   1 photon/bin/bkgdmgr  10r RECEIVE     1                          

356387   1 hoton/bin/wmswitch  10r RECEIVE     2                           

356388   1 r/photon/bin/saver  10r RECEIVE     1                          

401427   1 usr/photon/bin/pfm  10r RECEIVE     1                          

417813   1 usr/photon/bin/pfm  10r REPLY       192540                     

417819   1 r/photon/bin/pterm  10r RECEIVE     1                          

417822   1 bin/sh              10r SIGSUSPEND                             

417829   1 usr/photon/bin/ped  10r REPLY       192540                     

458790   1 r/photon/bin/pterm  10r RECEIVE     1                          

458791   1 bin/sh              10r SIGSUSPEND                             

471081   1 bin/script          10r REPLY       135188                     

471082   1 bin/sh              10r REPLY       135188                     

921640   1 r/photon/bin/pterm  10r RECEIVE     1                          

921644   1 bin/sh              10r SIGSUSPEND                             

921645   1 usr/photon/bin/ped  10r REPLY       192540                      

1392683   1 r/photon/bin/pterm  10r RECEIVE     1                          

1392686   1 bin/sh              10r SIGSUSPEND                             

1392687   1 usr/photon/bin/ped  10r REPLY       192540                     

1396784   1 bin/script          10r REPLY       135188                     

1400881   1 bin/script          10r REPLY       135188                     

1400882   1 bin/sh              10r SIGSUSPEND                             

1523763   1 ./f3.out            10r REPLY       1                          

1527860     (Zombie)                                                       

1527862   1 bin/sh              10r SIGSUSPEND                             

1531957   1 bin/pidin           10r REPLY       1     

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

Список поддерживаемых процессами сигналов:

# kill -l

1    HUP Hangup                        29   PROF Profiling timer expired

2    INT Interrupt                     30   XCPU CPU time limit exceeded

3   QUIT Quit                          31   XFSZ File size limit exceeded

4    ILL Illegal instruction           32     32 signal 32

5   TRAP Trace trap                    33     33 signal 33

6   ABRT Abort                         34     34 signal 34

7    EMT EMT trap                      35     35 signal 35

8    FPE Floating point exception      36     36 signal 36

9   KILL Killed                        37     37 signal 37

10    BUS Bus error                     38     38 signal 38

11   SEGV Memory fault                  39     39 signal 39

12    SYS Bad system call               40     40 signal 40

13   PIPE Broken pipe                   41     41 rtsig 41

14   ALRM Alarm clock                   42     42 rtsig 42

15   TERM Terminated                    43     43 rtsig 43

16   USR1 User defined signal 1         44     44 rtsig 44

17   USR2 User defined signal 2         45     45 rtsig 45

18   CHLD Child exited                  46     46 rtsig 46

19    PWR Power-fail/Restart            47     47 rtsig 47

20  WINCH Window size change            48     48 rtsig 48

21    URG Urgent I/O condition          49     49 rtsig 49

22     IO I/O possible                  50     50 rtsig 50

23   STOP Stopped (signal)              51     51 rtsig 51

24   TSTP Stopped                       52     52 rtsig 52

25   CONT Continued                     53     53 rtsig 53

26   TTIN Stopped (tty input)           54     54 rtsig 54

27   TTOU Stopped (tty output)          55     55 rtsig 55

28 VTALRM Virtual timer expired         56     56 rtsig 56

int kill(pid_t pid, int sig)

Системный вызов kill используется для того, чтобы послать любой сигнал любому процессу или группе процессов. Если pid больше 0, то сигнал sig посылается процессу pid. Если pid равен 0, то сигнал sig посылается всем процессам текущей группы. Если pid равен -1, то сигнал sig посылается всем процессам, кроме процесса 1 (init). Если pid меньше -1, то сигнал sig посылается всем процессам группы -pid.

sighandler_t signal(int signum, sighandler_t handler)

Системный вызов signal() устанавливает новый обработчик сигнала с номером signum в соответствии с параметром sighandler, который может быть функцией пользователя, SIG_IGN или SIG_DFL. При получении процессом сигнала с номером signum происходит следующее: если устанавливаемое значение обработчика равно SIG_IGN, то сигнал игнорируется; если оно равно SIG_DFL, то выполняются стандартные действия, связанные с сигналом. Если обработчик установлен в функцию sighandler, то вызывается функция sighandler с параметром signum.

1.

Создадим проект из 4х файлов: father.c, son1.c, son2.c, son3.c. Процесс father порождает процессы son1.c, son2.c, son3.c. Затем родительский процесс генерирует сигналы своим потомкам. В этих процессах необходимо реализовать обработку сигналов. Son1 – реакция на сигнал по умолчанию. Son2 – реакция игнорирования. Son3 – перехват и обработка сигнала.Тексты программ преведены ниже.

father.c

#include <stdio.h>

#include <stdlib.h>

#include <sys/resource.h>

main()

{

int pid, ppid, status;

int spid[3];

pid=getpid();

ppid=getppid();

printf("\n\n FATHER PARAM: pid=%i  ppid=%i \n", pid,ppid);

spid[0]=fork();

if(spid[0]==0) execl("son1.out","son1.out", NULL);

spid[1]=fork();

if(spid[1]==0) execl("son2.out","son2.out", NULL);

spid[2]=fork();

if(spid[2]==0) execl("son3.out","son3.out", NULL);

system("ps -f");

kill(spid[0], SIGUSR1);

kill(spid[1], SIGUSR1);

kill(spid[2], SIGUSR1);

system("ps -f");

}

son1.c

#include <stdio.h>

#include <signal.h>

main()

{

int pid, ppid;

pid=getpid();

ppid=getppid();

printf("\n SON1 PARAM: pid=%i ppid=%i \n",pid,ppid);

signal(SIGUSR1, SIG_DFL);

sleep(15);

}

son2.c

#include <stdio.h>

#include <signal.h>

main()

{

int pid, ppid;

pid=getpid();

ppid=getppid();

printf("\n SON2 PARAM: pid=%i ppid=%i \n",pid,ppid);

signal(SIGUSR1, SIG_IGN);

sleep(15);

}

son3.c

#include <stdio.h>

#include <signal.h>

void free(int);

main()

{

int pid, ppid;

pid=getpid();

ppid=getppid();

printf("\n SON3 PARAM: pid=%i ppid=%i \n",pid,ppid);

signal(SIGUSR1, free);

sleep(15);

}

void free(int sign)

{

printf("Perehvat\n");

sleep(10);

}

В результате выполнения father.

# ./father

FATHER PARAM: pid=1269804  ppid=405543

SON1 PARAM: pid=1273901 ppid=1269804

SON2 PARAM: pid=1273902 ppid=1269804

SON3 PARAM: pid=1273904 ppid=1269804

UID        PID       PPID  C STIME TTY          TIME CMD

0     401427     344095  - Jan11 ?        00:00:00 pfm

0     163863          2  - Jan11 ?        00:00:00 login

0     163864          2  - Jan11 ?        00:00:00 login

0     163865          2  - Jan11 ?        00:00:00 login

0     241690          2  - Jan11 ?        00:00:00 login

0     315419          1  - Jan11 ?        00:00:01 pwm

0     401438     401427  - Jan11 ?        00:00:00 /usr/photon/bin/pterm -U

0     344095          1  - Jan11 ?        00:00:01 shelf

0     344095          1  - Jan11 ?        00:00:01 shelf

0     364577          1  - Jan11 ?        00:00:00 bkgdmgr

0     364578          1  - Jan11 ?        00:00:00 wmswitch

0     364579          1  - Jan11 ?        00:00:00 saver

0     401444     401438  - Jan11 ?        00:00:00 /bin/sh -c /bin/sh

0     401445     401444  - Jan11 ?        00:00:00 ped rep_3

0     405542     344095  - Jan11 ?        00:00:00 pterm

0     405543     405542  - Jan11 ?        00:00:00 /bin/sh

0     405544     344095  - Jan11 ?        00:00:02 helpviewer

0     405545     405544  - Jan11 ?        00:00:00 /bin/sh /usr/photon/bin/

0     405546     405545  - Jan11 ?        00:00:00 /bin/sh /opt/mozilla/fir

0     434219     405546  - Jan11 ?        00:00:05 /opt/mozilla/firefox/bin

0     434219     405546  - Jan11 ?        00:00:05 /opt/mozilla/firefox/bin

0     434219     405546  - Jan11 ?        00:00:05 /opt/mozilla/firefox/bin

0    1269804     405543  - Jan11 ?        00:00:00 ./father

    0    1273901    1269804  - Jan11 ?        00:00:00 son1.out

    0    1273902    1269804  - Jan11 ?        00:00:00 son2.out

0    1286191    1273907  - Jan11 ?        00:00:00 ps -f

    0    1273904    1269804  - Jan11 ?        00:00:00 son3.out

0    1273907    1269804  - Jan11 ?        00:00:00 sh -c sh

Perehvat

UID        PID       PPID  C STIME TTY          TIME CMD

0     401427     344095  - Jan11 ?        00:00:00 pfm

0     163863          2  - Jan11 ?        00:00:00 login

0     163864          2  - Jan11 ?        00:00:00 login

0     163865          2  - Jan11 ?        00:00:00 login

0     241690          2  - Jan11 ?        00:00:00 login

0     315419          1  - Jan11 ?        00:00:01 pwm

0     401438     401427  - Jan11 ?        00:00:00 /usr/photon/bin/pterm -U

0     344095          1  - Jan11 ?        00:00:01 shelf

0     344095          1  - Jan11 ?        00:00:01 shelf

0     364577          1  - Jan11 ?        00:00:00 bkgdmgr

0     364578          1  - Jan11 ?        00:00:00 wmswitch

0     364579          1  - Jan11 ?        00:00:00 saver

0     401444     401438  - Jan11 ?        00:00:00 /bin/sh -c /bin/sh

0     401445     401444  - Jan11 ?        00:00:00 ped rep_3

0     405542     344095  - Jan11 ?        00:00:00 pterm

0     405543     405542  - Jan11 ?        00:00:00 /bin/sh

0     405544     344095  - Jan11 ?        00:00:02 helpviewer

0     405545     405544  - Jan11 ?        00:00:00 /bin/sh /usr/photon/bin/

0     405546     405545  - Jan11 ?        00:00:00 /bin/sh /opt/mozilla/fir

0     434219     405546  - Jan11 ?        00:00:05 /opt/mozilla/firefox/bin

0     434219     405546  - Jan11 ?        00:00:05 /opt/mozilla/firefox/bin

0     434219     405546  - Jan11 ?        00:00:05 /opt/mozilla/firefox/bin

0    1269804     405543  - Jan11 ?        00:00:00 ./father

    0    1273902    1269804  - Jan11 ?        00:00:00 son2.out

0    1298479    1269804  - Jan11 ?        00:00:00 sh -c sh

    0    1273904    1269804  - Jan11 ?        00:00:00 son3.out

0    1298481    1298479  - Jan11 ?        00:00:00 ps -f

Как видно из таблицы, процесс son1 завершился, son3 вывел сообщение, а son2 продолжает работать.

2. Для исследования того, как зависит время получения сигнала процессом от его состояния, используем три программы: sender посылает сигнал res1 и res2. Процесс, исполняющий одну из них, находится в момент получения сигнала в пассивном состоянии, другой – в активном.

sender.c

#include <stdio.h>

#include <stdlib.h>

#include <sys/resource.h>

main()

{

int pid, ppid, status;

int spid[2];

time_t t;

pid=getpid();

ppid=getppid();

printf("\n\n FATHER PARAM: pid=%i  ppid=%i \n", pid,ppid);

spid[0]=fork();

if(spid[0]==0) execl("res1.out","res1.out", NULL);

spid[1]=fork();

if(spid[1]==0) execl("res2.out","res2.out", NULL);

sleep(2);

printf("Sender: %i  to res1\n", time(&t));

kill(spid[0], SIGUSR1);

waitpid(spid[0], &status, 0);

sleep(2);

printf("Sender: %i  to res2\n", time(&t));

kill(spid[1], SIGUSR1);

waitpid(spid[1], &status, 0);

}

res1.c

#include <stdio.h>

#include <signal.h>

int code;

void reaction(int);

main()

{

int pid, ppid;

pid=getpid();

ppid=getppid();

printf("\n res1 PARAM: pid=%i ppid=%i \n",pid,ppid);

code = 1;

signal(SIGUSR1, reaction);

while(code);

}

void reaction (int sign)

{

time_t t;

printf("Res1: %i\n",time(&t));

code = 0;

return;

}

res2.c

#include <stdio.h>

#include <signal.h>

void reaction(int);

main()

{

int pid, ppid;

pid=getpid();

ppid=getppid();

printf("\n res2 PARAM: pid=%i ppid=%i \n",pid,ppid);

signal(SIGUSR1, reaction);

sleep(10);

}

void reaction (int sign)

{

time_t t;

printf("Res2: %i\n",time(&t));

exit(0);

}

В результате:

# ./sender

FATHER PARAM: pid=1683503  ppid=405543

res1 PARAM: pid=1687600 ppid=1683503

res2 PARAM: pid=1687601 ppid=1683503

Sender: 1263241135  to res1

Res1: 1263241135

Sender: 1263241137  to res2

Res2: 1263241137

Как видно, процессы получают сигнал в то же время, в какое им его послали.

3. nohup команда [аргумент...]

nohup запускает указанную команду с игнорированием сигналов потери связи (hangup) и увеличением приоритета для планировщика задач на 5; таким образом, команда будет продолжать выполняться в фоновом режиме и после того, как пользователь выйдет из системы. Приведём пример.

Nohup.c

main()

{

While(1)

{

Sleep(1);

}

}

В результате выполнения этой программы в фоновом режиме получаем таблицу процессов:

# nohup ./nohup&

[1] 2089004

# appending output to nohup.out

#

# ps

PID TTY          TIME CMD

401427 ?        00:00:01 pfm

163863 ?        00:00:00 login

163864 ?        00:00:00 login

163865 ?        00:00:00 login

241690 ?        00:00:00 login

315419 ?        00:00:01 pwm

401438 ?        00:00:00 /usr/photon/bin/pterm

344095 ?        00:00:02 shelf

364577 ?        00:00:00 bkgdmgr

364578 ?        00:00:00 wmswitch

364579 ?        00:00:00 saver

401444 ?        00:00:00 /bin/sh

401445 ?        00:00:01 ped

405542 ?        00:00:01 pterm

405543 ?        00:00:00 /bin/sh

405544 ?        00:00:04 helpviewer

405545 ?        00:00:00 /bin/sh

405546 ?        00:00:00 /bin/sh

434219 ?        00:00:10 /opt/mozilla/firefox/bin/mozserver

   2089004 ?        00:00:13 ./nohup

2097197 ?        00:00:00 ps

После выхода из системы и смены пользователя, посмотрим на запущенные

Похожие материалы

Информация о работе