father2.c
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
main(){
int status;
spawnl(P_NOWAIT,"./son2","son2",NULL,NULL);
printf("father still live!\n");
while(1){
sleep(1);
}
}
son2.c
#include <stdio.h>
#include <process.h>
main(){
sleep(1);
printf("I'm son, my PID is %i\n",getpid());
}
В результате получаем:
# ./father2&
[4] 1962028
# father still live!
I'm son, my PID is 1966127
pidin -p 1966127
pid tid name prio STATE Blocked
1966127 (Zombie)
Как видно, присутствует зомби.
Первый способ: игнорировать сигнал SIGCHLD, посылаемый потомком:
father3.c
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
main(){
int status;
signal(SIGCHLD,SIG_IGN);
spawnl(P_NOWAIT,"./son3","son3",NULL,NULL);
printf("father still live!\n");
while(1){
sleep(1);
}
}
В результате получаем:
# ./father3&
[5] 1974320
# father still live!
I'm son, my PID is 1978417
# pidin -p 1978417
pid tid name prio STATE Blocked
pidin: couldn't open /proc/1978417/as: No such file or directory
Как видно, зомби в этом случае нет.
Второй способ: использование при обращении к spawn() режима P_NOWAITO, который подразумевает наличие признака _SPAWN_NOZOMBIE:
father4.c
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
main(){
int status;
spawnl(P_NOWAITO,"./son3","son3",NULL,NULL);
printf("father still live!\n");
while(1){
sleep(1);
}
}
В результате получаем:
# ./father4&
[6] 1990705
# father still live!
I'm son, my PID is 1994802
# pidin -p 1994802
pid tid name prio STATE Blocked
pidin: couldn't open /proc/1994802/as: No such file or directory
Как видно, зомби в этом случае так же отсутствует.
2. Управление приоритетами
Управлением приоритетами процессов можно управлять с помощью функций библиотеки sched.
int getpriority(pid_t pid)
int setpriority(pid_t pid, int prio)
pid – PID процесса, операцию над которым требуется совершить
prio – новое значение его приоритета
Рассмотрим использование этих функций на примере программы getp.c, которая позволяет получить сведения о текущем значении приоритета процесса по PID и изменить его.
getp.c
#include <stdio.h>
#include <sched.h>
#include <stdio.h>
main(){
int j, i=0, pid=0;
pid = getpid();
while(1){
j=getprio(pid);
printf("Priority of PID %i is equal to %i. Enter new priority:\n ",pid,j);
scanf("%i",&i);
setprio(pid,i);
printf("Now priority of PID %i is equal to %i\n",pid,j=getprio(pid));
}
}
После компиляции программы мы можем изменять приоритет данного процесса:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.