Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

 } else {

/* Это родительский процесс. */

FILE* stream;

/* Закрываем копию выходного конца канала. */

close(fds[0]);

/* Приводим дескриптор входного конца канала к типу FILE*

и записываем данные в канал. */

stream = fdopen(fds[1], "w");

fprintf(stream, "This is a test.\n");

fprintf(stream, "Hello, world.\n");

fprintf(stream, "My dog has fleas.\n");

fprintf(stream, "This program is great.\n");

fprintf(stream, "One fish, two fish.\n");

fflush(stream);

close(fds[1]);

/* Дожидаемся завершения дочернего процесса. */

waitpid(pid, NULL, 0);

 }

 return 0;

}

5.4.4. Функции popen и pclose

Каналы часто используются для передачи данных программе, выполняющейся как подпроцесс (или приема данных от нее). Специально для этих целей предназначены функции

popen
и
pclose
, устраняющие необходимость в вызове функций
pipe
,
dup2
,
exec
и
fdopen
.

Сравните листинг 5.9 с предыдущим примером (листинг 5.8).

Листинг 5.9. (popen.c) Использование функций
popen
и
pclose

#include <stdio.h>

#include <unistd.h>

int main {

 FILE* stream = popen("sort", "w");

 fprintf(stream, "This is a test.\n");

 fprintf(stream, "Hello, world.\n");

 fprintf(stream, "My dog has fleas\n");

 fprintf(stream, "This program is great.\n");

 fprintf(stream, "One fish, two fish.\n");

 return pclose(stream);

}

Функция

popen
создает дочерний процесс, в котором выполняется команда
sort
. Один этот вызов заменяет вызовы функций
pipe
,
fork
,
dup2
и
execlp
. Второй аргумент,
"w"
, указывает на то, что текущий процесс хочет осуществлять запись в дочерний процесс. Функция
popen
возвращает указатель на один из концов канала; второй конец соединяется со стандартным входным потоком дочернего процесса. Функция
pclose
закрывает входной поток дочернего процесса, дожидается его завершения и возвращает код статуса.

Первый аргумент функции

popen
является командой интерпретатора, выполняемой в подпроцессе
/bin/sh
. Интерпретатор просматривает переменную среды
PATH
, чтобы определить, где следует искать команду. Если второй аргумент равен
"r"
, функция возвращает указатель на стандартный выходной поток дочернего процесса, чтобы программа могла читать данные из него. Если второй аргумент равен
"w"
, функция возвращает указатель на стандартный входной поток дочернего процесса, чтобы программа могла записывать данные в него. В случае ошибки возвращается пустой указатель.

Функция

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

5.4.5. Каналы FIFO

Файл FIFO (First-In, First-Out — первым пришел, первым обслужен) — это канал, у которого есть имя в файловой системе. Любой процесс может открыть и закрыть такой файл. Процессы, находящиеся на противоположных концах канала, не обязаны быть связанными друг с другом. FIFO-файлы называют именованными каналами.

FIFO-файл создается с помощью команды

mkfifo
. Путь к файлу указывается в командной строке, например:

% mkfifo /tmp/fifo

% ls -l /tmp/fifo

prw-rw-rw- 1 samuel users 0 Jan 16 14:04 /tmp/fifo

Первый символ в строке режима (

p
) указывает на то, что файл имеет тип FIFO (именованный канал). Теперь в одном терминальном окне можно осуществлять чтение из файла с помощью команды

% cat < /tmp/fifo

  • Читать дальше
  • 1
  • ...
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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