Системные ресурсы, связанные с дочерним процессом, освобождаются.
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
После выхода из системы и смены пользователя, посмотрим на запущенные
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.