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

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

Жанры

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);

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

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Гнев Пламенных

Дмитриева Ольга Олеговна
5. Пламенная
Фантастика:
фэнтези
4.80
рейтинг книги
Гнев Пламенных

Евреи России. Времена и события. История евреев Российской империи

Кандель Феликс Соломонович
Научно-образовательная:
история
5.00
рейтинг книги
Евреи России. Времена и события. История евреев Российской империи

Черный Маг Императора 20

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

Пламенев. Книга 3-7

Карелин Сергей Витальевич
Пламенев
Фантастика:
аниме
уся
фэнтези
сянься
5.00
рейтинг книги
Пламенев. Книга 3-7

Ожерелье Странника

Хаггард Генри Райдер
Приключения:
исторические приключения
7.50
рейтинг книги
Ожерелье Странника

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

География растений

Гумбольдт Александр
Классики естествознания
Научно-образовательная:
ботаника
7.50
рейтинг книги
География растений

Портрет дьявола: Собрание мистических рассказов

Скотт Вальтер
Проза:
классическая проза
8.09
рейтинг книги
Портрет дьявола: Собрание мистических рассказов

Трое с площади Карронад

Крапивин Владислав Петрович
Детские:
детские приключения
9.10
рейтинг книги
Трое с площади Карронад

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

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

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки