Результаты работы программы.
# 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,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.