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

на главную

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

// в цикле читаем имена всех текстовых файлов

while ((fname = fgets(..., fp);) != EOF) {

 // обрабатываем полученное значение переменной fname

}

// закрываем поток

pclose(fp);

Этот фрагмент кода в особых комментариях не нуждается. Сначала мы создаем поток для чтения (доступ «r») информации от порожденного процесса (ls *.txt). Затем в цикле while читаем имена файлов

до тех пор, пока не будет достигнут конец файла. После окончания операции ввода/вывода закрываем поток вызовом pclose(fp).

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

Листинг 26.1. Родительский процесс

#include <stdio.h>

#include <sys/wait.h>

#include <unistd.h>

int main {

 char buff[1024]={0};

 FILE * cp; // cp - child process - дочерний процесс

 int status;

 // Открываем канал. Дочерний процесс - /usr/bin/child

 cp=popen("/usr/bin/child", "w");

 if (!cp) {

printf("He могу открыть канал.\n");

exit(1);

 }

 printf("Введите информацию для передачи дочернему процессу ");

 // читаем ввод пользователя

 fgets(buff, sizeof(buff), stdin);

 // передаем данные дочернему процессу

 fprintf(cp, "%s\n", buff);

 // "выталкиваем" содержимое буфера в канал

 fflush(cp);

 // закрываем канал и проверяем состояние вызова pclose

 status=pclose(cp);

 if (!WIFEXITED(status))

printf("ошибка при закрытии канала\n");

 printf("Завершение работы родительского процесса\n");

 return 0;

}

Листинг 26.2. Дочерний процесс — исходный код /usr/bin/child

#include <stdio.h>

int main {

 char buff[1024]={0};

 fgets(buff, sizeof(buff), stdin);

 printf("Прочитал со стандартного ввода: %s\n", buff);

 printf("Завершение работы дочернего процесса\n");

return 0;

}

26.3.

Каналы типа FIFO

Канал FIFO — это канал, основанный на принципе очереди: «первым вошел, первым вышел». От обычного канала канал FIFO отличается следующим:

♦ Канал FIFO сохраняется в файловой системе в виде файла, поэтому каналы FIFO называются именованными.

♦ С именованным каналом, как с обычным файлом, могут работать все процессы, а не только предок и потомки.

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

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

$ mknod myFIFO p

$ mkfifo a=rw myFIFO

или системного вызова mknod:

int mknod(char *pathname, mode_t mode, dev_t dev);

Функция mknod используется не только для создания каналов FIFO. Она может создать любой i-узел (inode) файловой системы: файл, устройство, канал FIFO. Функция возвращает 0, если создание узла прошло успешно, или -1, если произошла ошибка. Проанализировать ошибку можно с помощью переменной

errno
, которая равна:

♦ EFAULT, ENOTDIR, ENOENT — неправильно задан путь;

♦ EACCESS — у вас недостаточно прав;

♦ ENAMETOOLONG — слишком длинный путь.

Пример создания FIFO-канала:

mknod("FIFO", S_IFIFO|0666, 0);

В текущем каталоге будет создан канал FIFO с правами доступа 0666.

Указывая права доступа создаваемого файла, помните, что они находятся под влиянием umask. Поэтому, если вы хотите установить истинное значение прав доступа, используйте системный вызов umask(0), чтобы временно отключить влияние umask:

umask(0);

mknod("FIFO", S_IFIFO|0666, 0);

Рассмотрим программу, создающую FIFO-канал и ожидающую данных по этому каналу. Программа после создания канала будет ожидать данных по этому каналу и не завершится до тех пор, пока вы не «убьете» процесс.

Листинг 26.3. Процесс-читатель

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <unistd.h>

#include <linux/stat.h>

/* Наш канал называется FIFO, он будет создан в текущем

 каталоге */

#define FIFO "FIFO"

void main(void) {

 FILE * fp;

 /* Буфер для чтения */

 char buf[126];

/* Создаем канал, если он еще не создан,

 права доступа 0666 */

 umask(0);

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

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Адаптация

Кораблев Родион
1. Другая сторона
Фантастика:
фэнтези
6.33
рейтинг книги
Адаптация

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Совпадений нет

Безрукова Елена
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Совпадений нет

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

LIVE-RPG. Эволюция-1

Кронос Александр
1. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.06
рейтинг книги
LIVE-RPG. Эволюция-1

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Восьмое правило дворянина

Герда Александр
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восьмое правило дворянина

Неудержимый. Книга IV

Боярский Андрей
4. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IV

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Истинная со скидкой для дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Истинная со скидкой для дракона

Курсант: Назад в СССР 7

Дамиров Рафаэль
7. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 7