Читайте также:
|
|
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define oops(m,x) {perror(m); exit(x);}
int run_pack(int *, int *);
int run_ui(int *, int *);
int main(void)
{
int pid;
int to_pack[2], from_pack[2];
/*образовать два канала*/
if(pipe(to_pack) == -1 || pipe(from_pack) == -1)
{
oops("pipe failed", 1);
}
/*создать два процесса*/
switch(fork())
{
case -1:
oops("ошибка fork",1);
break;
case 0:
printf("Порожденный процесс pid=%d\n",getpid());
run_pack(to_pack,from_pack);
default:
printf("Родительский процесс pid=%d\n",getpid());
run_ui(to_pack, from_pack);
wait(NULL);
}
}
int run_pack(int in[2], int out [2])
{
if(dup2(in[0],0) == -1) /*дублирование дескриптора конца для чтения в дескриптор 0*/
{
oops("dc: cannot redirect stdin",3);
}
close(in[0]); /*уже продублировали in[0] в 0, будем читать данные через дескриптор 0*/
close(in[1]); /*закрываем записываемый конец канала*/
if(dup2(out[1],1) == -1) /*дублирование дескриптора конца для записи в дескриптор 1*/
{
oops("run_pack: cannot redirect stdout",4);
}
close(out[1]); /*уже продублировали out[1] в 1, будем записывать данные через дескриптор 1*/
close(out[0]); /*закрываем читаемый конец канала*/
execlp("./pack","./pack", NULL);
oops("cannot run pack",5);
}
int run_ui(int to_pack[2], int from_pack[2])
{
unsigned short c; /* код состояния */
unsigned short f; /* признак ошибки */
unsigned short b; /* признак занятости */
unsigned short n; /* количество байт */
unsigned short UnitStateWord; /*слово состояния */
FILE *fin, *fout;
int i;
close(to_pack[0]); /*не производить чтение из канала к pack*/
close(from_pack[1]); /*не записывать в канал из pack*/
fout = fdopen(to_pack[1],"w"); /*преобразовать файловые дескрипторы*/
fin = fdopen(from_pack[0],"r"); /*в потоки*/
if (fout == NULL || fin == NULL)
{
fprintf(stderr, "Ошибка: не удалось преобразовать каналы в потоки");
exit(1);
}
for (i =0; i<5; i++)
{
printf("Введите код состояния (0 - 31) >");
scanf("%hd",&c);
printf("Введите признак ошибки (0 / 1) >");
scanf("%hd",&f);
printf("Введите признак занятости (0 / 1) >");
scanf("%hd",&b);
printf("Введите кол-во переданных байт (0 - 255) >");
scanf("%hd",&n);
if (fprintf(fout, "%hd %hd %hd %hd\n", c,f,b,n) == EOF)
{
fprintf(stderr, "Ошибка: не удалось записать в канал");
exit(1);
}
fflush(fout);
if (fscanf(fin, "%hd",&UnitStateWord) <= 0)
{
break;
}
printf("Запакованое слово %hd\n", UnitStateWord);
}
fclose(fout);
fclose(fin);
}
Дата добавления: 2015-04-20; просмотров: 9 | Поможем написать вашу работу | Нарушение авторских прав |