Текст программы.
#include <stdio.h>
#include <stdlib.h>
void main (int argc, char *argv[])
{
int desfilepipe[2],pid;
FILE *file1, *file2;
char *namef = argv[1];
char *namef2 = argv[2];
char buf1[50], buf2[50];
if (pipe(desfilepipe)==-1)
{ printf("can't create pipe\n");
exit(0);
}
else
{ printf ("pipe created\n");
}
pid=fork();
if(pid==-1)
{ printf("can't fork\n");
exit(0);
}
else if (pid==0)
{
file1=fopen(namef,"r");
if(file1==NULL)
{
printf ("son can't open file\n");
exit(0);
}
else {
int i=0;
while ((fscanf(file1,"%c",&buf1[i]))!=EOF)
i++;
close (file1);
write(desfilepipe[1],buf1,strlen(buf1));
close (desfilepipe[1]);
}
}
else
{
read(desfilepipe[0],buf2,sizeof(buf2));
close(desfilepipe[0]);
printf("father read: %s \n", buf2);
file2=fopen(namef2,"w");
if(file2==NULL)
{
printf ("father can't open file\n");
exit(0);
}
else {
fprintf(file2,buf2);
close (file2);
}
}
return;
}
1.3. Именованные каналы.
В файле server.c в основной программе:
Создайте 2 именованных канала, используя системный вызов mknod(), аргументы которого: имя файла FIFO в файловой системе; флаги владения, прав доступа (установите открытые для всех права доступа на чтение и на запись S_IFIFO | 0666). Откройте один канал на запись (chan1), другой - на чтение (chan2) и запустите серверную часть программы server(fdr, fdw); закройте файловые дескрипторы.
В серверной части программы:
Запишите имя файла в канал 1 (для записи) функцией write(); прочитайте данные из канала 2 в зарезервированный ранее буфер.
В файле client.c запрограммируйте в основной программе функции: открытия каналов для чтения (chan1) и записи (chan2); инициации клиентской части программы client(fdr, fdw); закрытия файловых дескрипторов и удаления каналов системным вызовом unlink(chan n).
В клиентской части программы: чтение имени файла из канала 1, сообщение серверу о начале записи, открытие канала 2 и запись в него данных, прочитанных из файла.
Откомпилируйте программы (gcc -o server server.c; gcc -o client client.c) Запустите на выполнение исполняемые модули ./server и ./client.
/* server.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char* argv[]){
/* Filename of chanel */
char fn_write[] = "chanel1";
char fn_read[] = "chanel2";
/* File des. of chanel */
int fd_write;
int fd_read;
char mes[255];
unlink(fn_write);
unlink(fn_read);
/* Check arguments */
if(argc < 2){
printf("from server: must be two arguments\n");
return -1;
}
/* Create file for fifo */
// if ( mkfifo(fn_write, S_IFIFO | 0666) == -1 ){
if ( mknod(fn_write, 0010666, 0) == -1 ){
printf("from server: can't create fifo %s\n",fn_write);
return 1;
}
// if ( mkfifo(fn_read, S_IFIFO | 0666) == -1 ){
if ( mknod(fn_read, 0010666, 0) == -1 ){
printf("from server: can't create fifo %s\n",fn_read);
return 2;
}
/* Open fifo chanel */
if( (fd_write = open(fn_write,O_WRONLY)) == NULL ){
printf("from server: can't open %s\n",fn_write);
return 3;
}
if( (fd_read = open(fn_read,O_RDONLY)) == NULL ){
printf("from server: can't open %s\n",fn_read);
return 4;
}
/* SERVER PART */
/* Send name of file */
if( write(fd_write, argv[1], sizeof(argv[1])) == -1 ){
printf("from server: can't send name of file\n");
return -1;
}
/* Receive text from file */
if( read(fd_read, mes, sizeof(mes)) <= 0 ){
printf("from server: can't read mes\n");
}
else{
printf("from server: Receive text:\n%s\n",mes);
}
close(fd_read);
close(fd_write);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.