Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 37 стр.

UptoLike

Составители: 

37
В случае возникновения ошибки функция возвращает нулевой указатель. Это
может случиться в следующих случаях: если канал или поток не могут быть созданы,
если не может быть создан порожденный процесс или если программа не может быть
выполнена.
int pclose(FILE *STREAM)
Функция используется для закрытия потока, созданного функцией popen. Она
ожидает, пока не завершится порожденный поток и возвращает его статус, аналогичный
возвращаемому функцией system.
Приведем пример использования popen и pclose для фильтрации вывода через
другую программу (в данном случае – more).
#include <stdio.h>
#include <stdlib.h>
void
write_data (FILE * stream)
{
int i;
for (i = 0; i < 100; i++)
fprintf (stream, "%d\n", i);
if (ferror (stream))
{
fprintf (stderr, "Output to stream failed.\n");
exit (EXIT_FAILURE);
}
}
int
main (void)
{
FILE *output;
output = popen ("more", "w");
if (!output)
{
fprintf (stderr, "Could not run more.\n");
return EXIT_FAILURE;
}
write_data (output);
pclose (output);
return EXIT_SUCCESS;
}
FIFO-файлы
FIFO-файлы схожи с каналами, однако создаются другим способом. FIFO-
файлы создаются в файловой системе с помощью функции mkfifo. После создания
такого файла, любой процесс может открыть его для чтения и записи таким же
способом, как и обычный файл. Тем не менее, он должен быть открыт и записывающим
и читающим процессом прежде, чем можно будет записывать и читать из него данные.
Функция mkfifo определена в заголовочном файле <sys/stat.h>:
int mkfifo(const char *FILENAME, mode_t MODE)
Функция mkfifo создает FIFO-файл с именем FILENAME. Аргумент MODE
задает маску доступа к файлу, идентичную используемой при создании обычного
файла.
При успешном выполнении функции функция возвращает 0, в случае ошибки
возвращается –1, а переменная errno в кроме ошибок, связанных с именем файла, может
принимать следующие значения:
        В случае возникновения ошибки функция возвращает нулевой указатель. Это
может случиться в следующих случаях: если канал или поток не могут быть созданы,
если не может быть создан порожденный процесс или если программа не может быть
выполнена.
       int pclose(FILE *STREAM)
       Функция используется для закрытия потока, созданного функцией popen. Она
ожидает, пока не завершится порожденный поток и возвращает его статус, аналогичный
возвращаемому функцией system.
       Приведем пример использования popen и pclose для фильтрации вывода через
другую программу (в данном случае – more).
       #include 
       #include 

       void
       write_data (FILE * stream)
       {
         int i;
         for (i = 0; i < 100; i++)
           fprintf (stream, "%d\n", i);
         if (ferror (stream))
         {
           fprintf (stderr, "Output to stream failed.\n");
           exit (EXIT_FAILURE);
         }
       }

       int
       main (void)
       {
         FILE *output;

           output = popen ("more", "w");
           if (!output)
           {
             fprintf (stderr, "Could not run more.\n");
             return EXIT_FAILURE;
           }
           write_data (output);
           pclose (output);
           return EXIT_SUCCESS;
       }

       FIFO-файлы
       FIFO-файлы схожи с каналами, однако создаются другим способом. FIFO-
файлы создаются в файловой системе с помощью функции mkfifo. После создания
такого файла, любой процесс может открыть его для чтения и записи таким же
способом, как и обычный файл. Тем не менее, он должен быть открыт и записывающим
и читающим процессом прежде, чем можно будет записывать и читать из него данные.
       Функция mkfifo определена в заголовочном файле :
       int mkfifo(const char *FILENAME, mode_t MODE)
       Функция mkfifo создает FIFO-файл с именем FILENAME. Аргумент MODE
задает маску доступа к файлу, идентичную используемой при создании обычного
файла.
       При успешном выполнении функции функция возвращает 0, в случае ошибки
возвращается –1, а переменная errno в кроме ошибок, связанных с именем файла, может
принимать следующие значения:


                                                                                37