Изучение основных принципов управления процессами и нитями в ОС LINUX, страница 9

Terminated

$ ps

       PID TTY          TIME CMD

   4861973 ?        00:00:00 pterm

   4861979 ?        00:00:00 sh

   4251678 ?        00:00:00 pwm

   4280351 ?        00:00:01 shelf

   4300833 ?        00:00:00 bkgdmgr

   4300834 ?        00:00:00 wmswitch

   4358180 ?        00:00:00 pfm

   4956197 ?        00:00:00 pterm

   4956198 ?        00:00:00 sh

   5021735 ?        00:00:00 ps

   4427816 ?        00:00:01 helpviewer

   4419625 ?        00:00:00 pterm

   4419626 ?        00:00:00 sh

   4419627 ?        00:00:00 ped

   4427820 ?        00:00:00 sh

   4427821 ?        00:00:00 sh

   4456494 ?        00:00:02 mozserver

   4485167 ?        00:00:00 pterm

   4485168 ?        00:00:00 sh

   4485169 ?        00:00:01 ped

При попытке удаления нити, удаляется процесс в целом, поскольку все нити имеют одинаковый идентификатор.

3.4.3. Модифицируйте программу так, чтобы управление второй нитью осуществлялось посредством сигнала SIGUSR1 из первой нити. На пятой секунде работы приложения удалите вторую нить. Для этого воспользуйтесь функцией pthread_kill(t2, SIGUSR), где
(t2 - дескриптор второй нити).

В Thread1 добавим pthread_kill(t2,SIGUSR1).

Результаты.

$ ./two_thr.out

thread1 started

thread2 started

       F S   UID        PID       PPID  C PRI  NI ADDR    SZ WCHAN TTY          TIME CMD

00000000 -   100    5226533    4861979  -  10   0    -  892K -     ?        00:00:00 two_thr.out

00000000 -   100    5226533    4861979  -  10   0    -  892K -     ?        00:00:00 two_thr.out

00000000 -   100    5226533    4861979  -  10   0    -  892K -     ?        00:00:00 two_thr.out

thread2: slept 1 times

thread2: slept 2 times

thread2: slept 3 times

thread2: slept 4 times

thread1: slept 1 times

User defined signal 1

$

С помощью указанного способа удалить только вторую нить не удалось, удалился процесс в целом.

3.4.4. Последняя модификация предполагает создание собственного обработчика сигнала, содержащего уведомление о начале его работы и возврат посредством функции pthread_exit(NULL). Сравните результаты, полученные после запуска этой модификации программы с результатами предыдущей.

Добавим:

SIGUSR1_handler (int sig_no)

{

printf("SIGUSR1 received by thread2\n");

pthread_exit(NULL);

return;

}

Добавим в thread1:

pthread_kill(t2,SIGUSR1);

Добавим в thread2:

signal(SIGUSR1,SIGUSR1_handler);

Результаты.

$ ./two_thr2.out

thread1 started

thread2 started

thread2: slept 1 times

thread2: slept 2 times

thread2: slept 3 times

thread2: slept 4 times

thread1: slept 1 times

SIGUSR1 received by thread2

thread1: slept 2 times

С помощью такого управления удалось корректно организовать удаление одной нити: все остальные нити данного процесса сохранились и продолжили выполняться.

4. Выводы.

В процессе выполнении работы были рассмотрены основные механизмы управления процессами и нитями в ОС QNX.

Были представлены основные закономерности взаимодействия родственных процессов – порождение дочернего процесса, ожидание/неожидание его завершения и т.д.

Кроме этого, было рассмотрено управление процессами посредством сигналов с помощью задания реакции на эти сигналы (по умолчанию, игнорирование, свой собственный обработчик).

В конце работы были показаны основные закономерности многонитевого функционирования, был предложен способ корректного завершения одной из нитей процесса, не приводящий к удалению всего процесса.