Средства межпроцессного взаимодействия (IPC) в ОС LINUX. Семафоры и разделяемая память. Ненадежные сигналы, страница 3

Результаты работы программы.

# echo "123qwerty" > src_file.txt

# echo "" > dst_file.txt

# cat src_file.txt

123qwerty

# cat dst_file.txt

# ./pipe

Father: Error - command line arg!!!

# ./pipe src_file.txt dst_file.txt

Father: pipe created.

Father: File dst_file.txt is open!!!

Son: File src_file.txt is open!!!

# cat dst_file.txt

123qwerty

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

Недостаток неименованных каналов в том, что они могут использоваться только родственными процессами, так как не имеют имен. Именованные каналы лишены этого недостатка.

В следующих двух программах server и client реализована связь двух не родственных процессов через именованный канал.

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

Клиент открывает канал 2 на запись и канал 1 на чтение, читает имя переданного файла из канала 1, и помещает прочитанные из файла данные к канал 2.

Листинг 4.1. server.c.

/*

* IPC Posix, FIFO

* Программа сервара.

*/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#define      BUF_LEN 255

void server( int, int, char* );

int main( int argc, char *argv[] )

{

int    read_fd,

write_fd;

static char input_file[]= "buf_file.txt";

static char FIFO_ch1[]    = "fifo.1";

static char FIFO_ch2[]    = "fifo.2";

/* Создаем FIFO */

if ( (mknod(FIFO_ch1, S_IFIFO | 0666, 0) < 0) && errno != EEXIST )

{

printf( "Server: create FIFO error!!!\n" );

exit(2);

}

if ( (mknod(FIFO_ch2, S_IFIFO | 0666, 0) < 0) && errno != EEXIST )

{

printf( "Server: create FIFO error!!!\n" );

exit(2);

}

printf( "Server: create FIFO is OK!!!\n" );

/* Получаем доступ к FIFO */

write_fd = open( FIFO_ch1, O_WRONLY );

read_fd = open( FIFO_ch2, O_RDONLY );

if ( write_fd < 0 || read_fd < 0 )

{

printf( "Server: error, can not open FIFO!!!\n" );

exit(3);

}

printf( "Server: open FIFO is OK!!!\n" );

/* Серверная часть программы */

server( write_fd, read_fd, input_file );

/* Закрываем дескрипторы */

close( read_fd );

close( write_fd );

return EXIT_SUCCESS;

}

/* Серверная часть программы */

void server( int write_fd, int read_fd, char* input_file )

{

char   buf[ BUF_LEN ];

int    n;

/* Запись в первый канал имени файла */

if ( write(write_fd, input_file, strlen(input_file)) != strlen(input_file) )

{

printf( "Server: error write to FIFO!!!\n" );

exit(4);

}

printf( "Server: write is OK!!!\n" );

/* Чение из второго канала */

while ( ( n = read(read_fd, buf, BUF_LEN) ) > 0 )

{

printf( "Server: read data...\n" );

if ( write(1, buf, n) != n )

{

printf( "Server: error output!!!\n" );

exit(5);

}

printf("\n");

}

}

Листинг 4.2. client.c.

/*

* IPC Posix, FIFO

* Программа клиента.

*/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#define      BUF_LEN 80

void client( int, int );

int main( int argc, char *argv[] )

{

int    read_fd,

write_fd;

static char FIFO_ch1[] = "fifo.1";

static char FIFO_ch2[] = "fifo.2";

/* Получаем доступ к FIFO */

read_fd = open( FIFO_ch1, O_RDONLY );

write_fd = open( FIFO_ch2, O_WRONLY );

if ( write_fd < 0 || read_fd < 0 )

{

printf( "Client: error, can not open FIFO!!!\n" );

exit(3);

}

printf( "Client: open FIFO is OK!!!\n" );

/* Клиентская часть программы */

client( write_fd, read_fd );

/* Закрываем дескрипторы */

close( read_fd );

close( write_fd );

return EXIT_SUCCESS;

}

void client( int write_fd, int read_fd )

{

char   buf[ BUF_LEN ];

char   input_file_name[ BUF_LEN ];

int    input_file_fd,