IPCPOSIX на примере QNX Neutrino (Отчет о выполнении научно-исследовательской работы), страница 4

      {

            printf("Father : can't create pipe\n");

            exit(-1);

      };   

      printf("Father : pipe is created\n");

      pid = fork();

      if(pid==-1)

      {

                  printf("Fork ERR\n");

                  exit(1);

      }

      else  if (pid==0)

      {

            f_in=fopen(filename,"r");

            if (f_in<=0)

            {          

                  printf("open file ERR%s\n", filename);

                  exit(1);

            }

            else

            {

                  printf("file's opened: \n%s\n", filename);

                  int i=0;

                  while(      (fscanf(f_in,"%s",&buf))!=EOF)

                        i++;

                  write(filedes[1],buf,strlen(buf)); //ф-ция сына

                close(f_in);

                  close(filedes[1]);

            }

      }

return 0;

      else

      {

            read (filedes[0],buf_read,sizeof(buf_read)); //ф-ция отца

            close(filedes[0]);

            printf("reading.....\n %s\n",buf_read);

      }

      return 0;

}

Входной файл inp.txt:  testing_text!!!

Результаты:

# ./pipe inp.txt

Father : pipe is created

file's opened:

inp.txt

reading.....

 testing_text!!!Гї"Гњ7В°"Гњ7В°"Гњ7°¼

                             ГІ7В°IZ7°·Z7В°

Текст из файла считан целиком, кроме того, вывелись неопределенные значения из буфера. Особенностью данного метода является возможность обмена данными только между процессами-«родственниками», т.к. процесс может получить файловые дескрипторы для работы с неименнованнным каналом, только наследую их от родительского процесса.

IV. Именованные каналы

В файле server.c в основной программе:

Создайте 2 именованных канала, используя системный вызов mkfifo (), аргументы которого: имя файла FIFO в файловой системе; флаги владения, прав доступа (установите открытые для всех права доступа на чтение и на запись  S_IFIFO | 0666).
Откройте один канал на запись (chan1), другой - на чтение (chan2) и запустите серверную часть программы server(fdr, fdw); закройте файловые дескрипторы.

В серверной части программы:

Запишите имя файла в канал 1 (для записи) функцией write(); прочитайте данные из канала 2 в зарезервированный ранее буфер.

В файле  client.c запрограммируйте в основной программе функции: открытия каналов для чтения (chan1) и записи (chan2); инициации клиентской части программы client(fdr, fdw); закрытия файловых дескрипторов и удаления каналов системным вызовом unlink(chan n).

В клиентской части программы: чтение имени файла из канала 1, сообщение серверу о начале записи, открытие канала 2 и запись в него данных, прочитанных из файла.

Client.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <string.h>

#include <errno.h>

char* chan1="chan1";

char* chan2="chan2";

const int c_bsize=256;

int main (void)

{

      int k = mkfifo("chan1", 0666);

      if ((k=-1)&&(errno!=EEXIST))

      {

            printf("CLIENT ERR (chan1 creating) \n");

            return -1;

      }

      k = mkfifo("chan2", 0666);

      if ((k=-1)&&(errno!=EEXIST))