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

0    6492198    6492197  - Nov23 ?        00:00:05 vserver.file

0    7114791    5718039  - Nov23 ?        00:00:00 ped prio_log.txt

0    7118888    5718051  - 23:59 ?        00:00:00 ps -f

После выхода из системы и повторного захода:

# ps -f

UID        PID       PPID  C STIME TTY          TIME CMD

0     335894          2  - Nov23 ?        00:00:00 login

0    7401495    7319583  - Nov24 ?        00:00:00 pterm

0    7401499    7401495  - Nov24 ?        00:00:00 /bin/sh

0    7274524          1  - Nov24 ?        00:00:00 pwm

0    7319583          1  - Nov24 ?        00:00:01 shelf

0    7319583          1  - Nov24 ?        00:00:01 shelf

0    7356448          1  - Nov24 ?        00:00:00 bkgdmgr

0    7356449          1  - Nov24 ?        00:00:00 wmswitch

0    7356450          1  - Nov24 ?        00:00:00 saver

0    7401507    7401499  - 00:00 ?        00:00:00 ps -f

0    7106596          1  - Nov23 ?        00:00:00 ./nohup

Процесс продолжал выполняться. При этом изменился его PPID в всязи с тем, что родительскии процесс /bin/sh был завершен.

2.4.  Многонитиевое функционирование.

pthread.cпрограмма, формирующая несколько нитей.

#include <pthread.h>

void* thread1( void* ptr)

{    

int i = 1;

while(i < 3)

{

sleep(5);

printf("thread1:\t\t%i\n", i++);

}

}

void* thread2( void* ptr)

{    

int i = 1;

while(i<13)

{

sleep(1);

printf("thread2:\t\t%i\n", i++);

}

}

main()

{    

pthread_t  t1, t2;

pthread_create(&t1, NULL, thread1, NULL);

pthread_create(&t2, NULL, thread2, NULL);

pthread_join(t1, NULL);

pthread_join(t2, NULL);

}

Пример выполнения программы:

# make pthreads

cc     pthreads.c   -o pthreads

# ./pthreads

thread2:                1

thread2:                2

thread2:                3

thread2:                4

thread1:                1

thread2:                5

thread2:                6

thread2:                7

thread2:                8

thread2:                9

thread1:                2

thread2:                10

thread2:                11

thread2:                12

При этом в другом терминале можно наблюдать состояние процесса:

# ps -f

UID        PID       PPID  C STIME TTY          TIME CMD

0     335894          2  - Nov23 ?        00:00:00 login

0    7401495    7319583  - Nov24 ?        00:00:04 pterm

0    7401499    7401495  - Nov24 ?        00:00:00 /bin/sh

0    7274524          1  - Nov24 ?        00:00:01 pwm

0    7319583          1  - Nov24 ?        00:00:07 shelf

0    7319583          1  - Nov24 ?        00:00:07 shelf

0    7356448          1  - Nov24 ?        00:00:00 bkgdmgr

0    7356449          1  - Nov24 ?        00:00:00 wmswitch

0    7356450          1  - Nov24 ?        00:00:02 saver

0    7409699    7319583  - Nov24 ?        00:00:01 pfm

0    7594020    7319583  - Nov24 ?        00:00:00 pterm

0    7483429    7319583  - Nov24 ?        00:00:02 helpviewer

0    7483430    7483429  - Nov24 ?        00:00:04 vserver.file

0    7594023    7594020  - Nov24 ?        00:00:00 /bin/sh

0    7602216    7401499  - Nov24 ?        00:00:00 ./pthreads

0    7602216    7401499  - Nov24 ?        00:00:00 ./pthreads

0    7602216    7401499  - Nov24 ?        00:00:00 ./pthreads

0    7606313    7594023  - 00:24 ?        00:00:00 ps -f

Нити имеют тот же PID, что и создавший их процесс, а синхронизация посредством pthread_join() позволяет им совместно использовать терминал.

Примеры реакции нитей на получаемый сигнал:

pthread2.c

#include <pthread.h>

#include <signal.h>

pthread_t  t1, t2;

void* thread1( void* ptr)

{    

int i = 1;

while(i<3)

{

sleep(5);

printf("thread1:\t\t%i\n", i++);

if (i==2) pthread_kill(t2, SIGKILL);

}

}

void* thread2( void* ptr)

{    

int i = 1;

while(i<13)

{

sleep(1);

printf("thread2:\t\t%i\n", i++);

}

}

main()

{    

pthread_create(&t1, NULL, thread1, NULL);

pthread_create(&t2, NULL, thread2, NULL);

pthread_join(t1, NULL);

pthread_join(t2, NULL);

}