Текст програми
#include| <stdio|.h>
#include| <pthread|.h>
#include| <sys/neutrino.h>
pthread_t| thread_id1|;
pthread_t| thread_id2|;
void| * long_thread1|(void| *notused)
{
int| n;
for|(n=0|;n<5;n++)
{
printf|("Eto| pervii| potok|, TID| %d - N povtora| %d \n", thread_id1|, n );
sleep|(2);
}
}
void| * long_thread2|(void| *notused)
{
int| m;
for|(m=0|; m<5|; m++|)
{
printf|("Eto| vtoroi| potok|, TID| %d - N povtora| %d \n", thread_id2|, m );
sleep|(1);
}
}
int| main|(void|)
{
printf|("Prog| threads| PID| %d \n",getpid());
pthread_create|(&thread_id1|, NULL|, long_thread1|, NULL|);
pthread_create|(&thread_id2|, NULL|, long_thread2|, NULL|);
sleep|(40);
return|(1);
}
Послідовність дій
У програмі створюються і запускаються на виконання два потоки. Коли один потік припиняється, відразу починає|розпочинає| роботу іншій. Припинення|призупинення| реалізоване функцією sleep|(n), яка зупиняє процес на n секунд. На екрані можна спостерігати, як по черзі працюють два процеси.
Результати
# gcc| pthread|.c
# `pwd`a|.out
Prog| threads| PID| 852000
Etot| pervii| potok|, TID| 0 - N povtora| 0
Etot| vtoroi| potok|, TID| 0 - N povtora| 0
Etot| vtoroi| potok|, TID| 3 - N povtora| 1
Etot| pervii| potok|, TID| 2 - N povtora| 1
Etot| vtoroi| potok|, TID| 3 - N povtora| 2
Etot| vtoroi| potok|, TID| 3 - N povtora| 3
Etot| pervii| potok|, TID| 2 - N povtora| 2
Etot| vtoroi| potok|, TID| 3 - N povtora| 4
Etot| pervii| potok|, TID| 2 - N povtora| 3
Etot| pervii| potok|, TID| 2 - N povtora| 4
#
Завдання
Написати програму, яка за допомогою дочірнього процесу підраховує кількість рядків у файлі.
Написати програму, яка при завершенні 1-го процесу породжувала ще 2-ва таких же.
Підрахунок кількості входжень вказаного символу у всіх файлах поточного каталога. Обробка файлу - в породженому процесі.
Пошук вказаного рядка у вказаному файлі. Обробка одного рядка - в породженому процесі.
Множення матриці на вектор. Обробка одного рядка матриці - в породженому процесі.
Припинити на 1c батьківський процес. У дочірньому процесі за допомогою системного виклику system() виконати стандартну команду ps, перенаправивши вивід у файл номер 1. Услід за цим завершити дочірній процес. У батьківському процесі викликати ps і перенаправити у файл номер 2. Звільнити елемент таблиці процесів породженого процесу.
Припинити на 1с батьківський процес. Виконати в дочірньому процесі один з системних викликів exec(), передавши йому як параметр стандартну програму ps. Аналогічно виконати виклик ps в батьківському процесі. Результати роботи команд ps в обох процесах перенаправити в один і той же файл.
Визначити в програмі глобальну змінну var із значенням, рівним 1. Перевизначити стандартний вивід і батьківського, і дочірнього процесів в один і той же файл. До виконання розгалуження збільшити на 1 змінну var, причому вивести її значення, як до збільшення, так і після. У батьківському процесі збільшити значення змінної на 3, а в дочірньому на 5. Вивести значення змінної до збільшення і після нього усередині кожного з процесів. Результат пояснити.
Припинити на 2с дочірній процес. У дочірньому процесі за допомогою системного виклику system() виконати стандартну команду ls, перенаправивши вивід у файл номер 2. Услід за цим завершити дочірній процес. У батьківському процесі викликати ls -l і перенаправити у файл номер 1. Звільнити елемент таблиці процесів породженого процесу.
Програма породжує через кожних 2 секунди 5 нових процесів. Кожен з цих процесів виконується заданий час і зупиняється, повідомляючи про це батька. Програма-батько виводить на екран всі повідомлення про зміни в процесах.