Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

 for (lots_of_threads = NUM_THREADS - 1; lots_of_threads >= 0;

lots of threads--) {

res = pthread_join(a_thread[lots_of_threads], &thread_result);

if (res == 0) {

printf("Picked up a thread\n");

} else {

perror("pthread_join failed");

}

 }

 printf("All done\n");

 exit(EXIT_SUCCESS);

}

void* thread_function(void* arg) {

 int my_number = (int)arg;

 int rand_num;

 printf("thread_function is running. Argument was %d\n", my_number);

 rand_num = 1+(int)(9.0*rand/(RAND_MAX+1.0));

 sleep(rand_num);

 printf("Bye from %d\n", my_number);

 pthread_exit(NULL);

}

Резюме

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

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

Глава 13

Связь между процессами: каналы

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

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

В данной главе мы обсудим следующие темы:

определение канала;

каналы процессов;

вызовы каналов;

родительские и дочерние процессы;

именованные каналы — FIFO;

замечания, касающиеся клиент-серверных приложений.

Что такое канал?

Мы применяем термин "канал" для обозначения соединения потока данных одного процесса с другим. Обычно вы присоединяете или связываете каналом вывод одного процесса с вводом другого.

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

cmd1 | cmd2

Командная оболочка организует стандартный ввод и вывод двух команд так, что:

 стандартный ввод

cmd1
поступает с клавиатуры терминала;

 стандартный вывод

cmd1
поставляется
cmd2
как ее стандартный ввод;

 стандартный вывод

cmd2
подсоединен к экрану терминала.

На самом деле командная оболочка заново соединила потоки стандартных ввода и вывода так, что потоки данных проходят с клавиатурного ввода через две команды и выводятся на экран. На рис. 13.1 приведено визуальное представление этого процесса.

Рис. 13.1 

В этой главе вы увидите, как достичь этого эффекта в программе и как можно использовать каналы для связи многих процессов, что позволит создать простую клиент-серверную систему.

Каналы процессов

Возможно, простейший способ передачи данных между программами — применение функций

popen
и
pclose
. У них следующие прототипы:

#include <stdio.h>

FILE *popen(const char *command, const char *open_mode);

int pclose(FILE *stream_to_close);

popen

Функция popen позволяет программе запустить другую программу как новый процесс и либо передать ей данные, либо получить их из нее. Строка

command
— это имя программы для выполнения вместе с любыми параметрами, параметр
open_mode
должен быть
"r"
или
"w"
.

Если

open_mode
"r"
, вывод вызванной программы становится доступен вызывающей программе и может быть считан из возвращаемого функцией
popen
файлового потока
FILE*
с помощью обычных функций библиотеки stdio, предназначенных для чтения (например,
fread
). Но если
open_mode
"w"
, программа может отправить данные вызванной команде с помощью вызова функции
fwrite
. Далее вызванная программа сможет читать данные из своего стандартного ввода. Обычно вызванная программа не знает, что она считывает данные из другого процесса; она просто читает свой поток стандартного ввода и воздействует на него.

Вызов функции

popen
должен задавать
"r"
или
"w"
; никакого другого значения стандартной реализацией popen не поддерживается. Это означает, что вы не можете вызвать другую программу и одновременно читать из нее и писать в нее. В случае сбоя
popen
возвращает пустой указатель. Если вы хотите создать двунаправленную связь с помощью каналов, стандартное решение — применить два канала: по одному для потока данных каждого направления.

Поделиться:
Популярные книги

Аврора Горелика (сборник)

Аксенов Василий Павлович
Поэзия:
драматургия
6.25
рейтинг книги
Аврора Горелика (сборник)

12 великих комедий

Шекспир Уильям
Вожди Советского Союза
Проза:
классическая проза
6.25
рейтинг книги
12 великих комедий

Газлайтер. Том 21

Володин Григорий Григорьевич
21. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.25
рейтинг книги
Газлайтер. Том 21

Маркс и Энгельс

Серебрякова Галина Иосифовна
421. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Маркс и Энгельс

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Последний Паладин. Том 3

Саваровский Роман
3. Путь Паладина
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 3

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин

Лунный бассейн. Металлическое чудовище (сборник)

Меррит Абрахам Грэйс
2. Абрахам Меррит. Собрание сочинений в 5 томах
Фантастика:
ужасы и мистика
5.00
рейтинг книги
Лунный бассейн. Металлическое чудовище (сборник)

С чего все началось?

Katelyn
Любовные романы:
современные любовные романы
3.40
рейтинг книги
С чего все началось?

Дважды одарённый. Том IX

Тарс Элиан
9. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Дважды одарённый. Том IX

Отряд

Посняков Андрей
Отряд тайных дел
Фантастика:
фэнтези
боевая фантастика
6.25
рейтинг книги
Отряд

Шайтан Иван 5

Тен Эдуард
5. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
5.50
рейтинг книги
Шайтан Иван 5

Америго Веспуччи. Фернан Магеллан

Цвейг Стефан
Проза:
историческая проза
5.00
рейтинг книги
Америго Веспуччи. Фернан Магеллан

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7