Использование каналов в Linux с C - PullRequest
0 голосов
/ 10 мая 2010

Я прохожу курс по операционным системам, и мы должны научиться использовать каналы для передачи данных между процессами.

Нам дали этот простой кусок кода, который демонстрирует, как использовать каналы, но мне трудно это понять.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main()
{
      int  pipefd [2], n;
      char buff[100] ;


      if( pipe( pipefd) < 0)
      {
        printf("can not create pipe \n");
      }
      printf("read fd = %d, write fd = %d \n", pipefd[0], pipefd[1]);
      if ( write (pipefd[1],"hello world\n", 12)!= 12)
      {
        printf("pipe write error \n");
      }
      if(  ( n = read ( pipefd[0] , buff, sizeof ( buff)  ) ) <= 0 )
      {
        printf("pipe read error \n");
      }
      write ( 1, buff, n ) ;
exit (0);
  }

Что делает функция записи? Похоже, что данные отправляются в канал, а также выводятся на экран (по крайней мере, во второй раз вызывается функция записи, которая делает это).

Есть ли у кого-нибудь предложения о хороших веб-сайтах для изучения таких тем, как эта, FIFO, сигналы, другие основные команды Linux, используемые в C?

Ответы [ 3 ]

5 голосов
/ 10 мая 2010

Программа создает канал с помощью вызова pipe (2) . Канал имеет файловый дескриптор, открытый для чтения (pipefd[0]) и один открытый для записи (pipefd[1]). Программа сначала записывает «hello world \ n» в конец write канала, а затем считывает сообщение из конца read канала. Затем сообщение записывается в консоль (stdout) через write (2) вызов файлового дескриптора 1.


Руководство Beej по межпроцессному взаимодействию Unix содержит полезную информацию о Unix / Linux IPC. Вы часто найдете ссылки на его другое руководство, Руководство Биджа по сетевому программированию .

Я нашел Понимание программирования на UNIX / LINUX: руководство по теории и практике Брюса Молэя - отличная книга по системному программированию Unix / Linux.

4 голосов
/ 10 мая 2010

Первый аргумент write() - дескриптор файла для записи.

При первом вызове код записывается в один конецтруба (pipefd[1]).Во втором вызове выполняется запись в файловый дескриптор 1, который в POSIX-совместимых системах всегда является стандартным выводом (консоль).Файловый дескриптор 2 - это стандартная ошибка, чего бы это ни стоило.

3 голосов
/ 10 мая 2010

Функция создает канал и сохраняет дескрипторы конечных файлов в pipefd[0] и pipefd[1]. Все, что вы пишете на одном конце, может быть прочитано с другого, и наоборот. Первый вызов write() записывает "hello world" в pipefd[1], а вызов read() читает те же данные из pipefd[0]. Затем второй вызов write() записывает эти данные в дескриптор файла 1, который по умолчанию равен STDOUT, поэтому вы видите его на экране.

Трубы поначалу могут сбивать с толку. По мере того, как вы будете читать / писать больше кода, использующего их, они станут намного проще для понимания. Я рекомендую W. Richard Stevens Расширенное программирование в среде UNIX в качестве хорошей книги, чтобы понять их. Насколько я помню, у него есть хорошие примеры кода.

...