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

UptoLike

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

36
void write_to_pipe (int file)
{
FILE *stream;
stream = fdopen (file, "w");
fprintf (stream, "hello, world!\n");
fprintf (stream, "goodbye, world!\n");
fclose (stream);
}
int
main (void)
{
pid_t pid;
int mypipe[2];
if (pipe (mypipe))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
pid = fork ();
if (pid == (pid_t) 0)
{
read_from_pipe (mypipe[0]);
return EXIT_SUCCESS;
}
else if (pid < (pid_t) 0)
{
fprintf (stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
else
{
write_to_pipe (mypipe[1]);
return EXIT_SUCCESS;
}
}
Взаимодействие с порожденным процессом
Обычное использование каналов заключается в том, чтобы посылать или
получать данные от порожденного процесса. Один из способов выполнения этой задачи
заключается в использовании функций pipe(для создания канала), fork (для создания
порожденного процесса), dup2 (для того, чтобызаставить порожденный процесс
использовать канал как выходной поток), exec(для выполнения новой программы).
Однако, существует и более простой способ такого взаимодействия с использованием
функций popen и pclose.
FILE *popen(const char *COMMAND, const char *MODE)
Функция выполняет команду COMMAND как независимый процесс, создает
канал, возвращает поток, ассоциированный с этим каналом и возвращает управление в
вызывающую программу. Таким образом, родительский и порожденный процесс
выполняются независимо.
Если аргумент MODE задается как “r”, то родительский процесс может
получить данные из стандартного канала вывода порожденного процесса.
Порожденный процесс наследует канал ввода от родительского процесса.
Если аргумент MODE задается как “w”, то родительский процесс может
послать данные в стандартный канал ввода порожденного процесса. Порожденный
процесс наследует канал вывода от родительского процесса.
       void write_to_pipe (int file)
       {
         FILE *stream;
         stream = fdopen (file, "w");
         fprintf (stream, "hello, world!\n");
         fprintf (stream, "goodbye, world!\n");
         fclose (stream);
       }

       int
       main (void)
       {
         pid_t pid;
         int mypipe[2];

           if (pipe (mypipe))
           {
             fprintf (stderr, "Pipe failed.\n");
             return EXIT_FAILURE;
           }

           pid = fork ();
           if (pid == (pid_t) 0)
           {
             read_from_pipe (mypipe[0]);
             return EXIT_SUCCESS;
           }
           else if (pid < (pid_t) 0)
           {
             fprintf (stderr, "Fork failed.\n");
             return EXIT_FAILURE;
           }
           else
           {
             write_to_pipe (mypipe[1]);
             return EXIT_SUCCESS;
           }
       }

       Взаимодействие с порожденным процессом
       Обычное использование каналов заключается в том, чтобы посылать или
получать данные от порожденного процесса. Один из способов выполнения этой задачи
заключается в использовании функций pipe(для создания канала), fork (для создания
порожденного процесса), dup2 (для того, чтобы “заставить” порожденный процесс
использовать канал как выходной поток), exec(для выполнения новой программы).
Однако, существует и более простой способ такого взаимодействия с использованием
функций popen и pclose.
       FILE *popen(const char *COMMAND, const char *MODE)
        Функция выполняет команду COMMAND как независимый процесс, создает
канал, возвращает поток, ассоциированный с этим каналом и возвращает управление в
вызывающую программу. Таким образом, родительский и порожденный процесс
выполняются независимо.
        Если аргумент MODE задается как “r”, то родительский процесс может
получить данные из стандартного канала вывода порожденного процесса.
Порожденный процесс наследует канал ввода от родительского процесса.
        Если аргумент MODE задается как “w”, то родительский процесс может
послать данные в стандартный канал ввода порожденного процесса. Порожденный
процесс наследует канал вывода от родительского процесса.


       36