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