#include <sys/types.h>
#include <stdlib.h>
#include <process.h>
#include <signal.h>
main( int argc, char* argv[])
{
signal(SIGCHLD, SIG_IGN);
spawnl(P_NOWAIT, "./spson2","spson2", NULL);
sleep(5);
system(" pidin | grep Zombie");
}
spfather4.c
#include <sys/types.h>
#include <stdlib.h>
#include <process.h>
main( int argc, char* argv[])
{
spawnl(P_NOWAITO, "./spson2","spson2", NULL);
sleep(5);
system(" pidin | grep Zombie");
}
spson2.c
#include <stdlib.h>
main()
{
printf("son PID = %i\n", getpid());
}
spzombie – скрипт для демонтрации работы программ.
#!/bin/ksh
make spfather2
make spfather3
make spfather4
make spson2
echo " ./spfather2"
./spfather2
echo " ./spfather3"
./spfather3
echo " ./spfather4"
./spfather4
Пример выполнения скрипта:
# chmod 755 spzombie
# ./spzombie
cc spfather2.c -o spfather2
cc spfather3.c -o spfather3
cc spfather4.c -o spfather4
make: `spson2' is up to date.
./spfather2
son PID = 10068008
10068008 (Zombie)
./spfather3
son PID = 10100776
./spfather4
son PID = 10113065
В первом случае процесс spson стал процессом-зомби. Чтобы это избежать нужно: либо игнорировать сигнал SIGCHLD, посылаемый системой после завершения дочернего процесса, либо использовать режим P_NOWAITO, который подразумевает наличие признака _SPAWN_NOZOMBIE.
2.6. Управление приоиитетами.
Функции intgetpriority(pid_tpidint) иsetpriority(pid_tpid, intprio) позволяют получить информацию об уровне приоритета процесса по его PID, а так же изменить уровень приоритета.
сhange.c – программа, позволяющая изменить уровень приоритета процесса по его PID.
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
main( int argc, char* argv[])
{
int pidp, priop;
printf(" Enter pid of change process:\n");
scanf("%i", &pidp);
printf(" Priority process = %i\n", getprio(pidp));
printf(" Enter new priority of process:\n");
scanf("%i", &priop);
setprio(pidp, priop);
printf(" Priority %i of process with pid %i\n", getprio(pidp), pidp);
}
test.c – тестовая программа.
main()
{
while(1)
{
sleep(1);
}
}
Пример выполнения программы:
# ./test&
[1] 11321382
# make change
cc change.c -o change
# ./change
Enter pid of change process:
11321382
Priority process = 10
Enter new priority of process:
12
Priority 12 of process with pid 11321382
# ps -l -p 11321382
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
00000200 - 0 11321382 7401499 - 12 0 - 600K - ? 00:00:00 ./test
Cемейство функций, предназначенных для работы с параметрами процесса, относящимися к задаче планирования, оформленными в структуру sched_param: sched_getparam() и sched_setparam().
change2.c – программа, позволяющая изменить уровень приоритета процесса по его PID.
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
main( int argc, char* argv[])
{
struct sched_param tp;
int pidp, priop;
printf(" Enter pid of change process:\n");
scanf("%i", &pidp);
sched_getparam(pidp, &tp);
printf(" Priority process = %i\n", tp.sched_priority);
printf(" Enter new priority of process:\n");
scanf("%i", &priop);
tp.sched_priority = priop;
sched_setparam(pidp, &tp);
sched_getparam(pidp, &tp);
printf(" Priority %i of process with pid %i\n", tp.sched_priority, pidp);
}
Пример выполнения прогрммы:
# ./test&
[1] 11780132
# ./change2
Enter pid of change process:
11780132
Priority process = 10
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.