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

#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