Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Приложение А Текст программы-клиента

Читайте также:
  1. I. Прочитайте текст и переведите его письменно на русский язык, используя словарь.
  2. I. Прочитайте текст и переведите его письменно на русский язык, используя словарь.
  3. II. Работа над созданием собственного текста.
  4. II. Редактирование текста
  5. II.Редактирование текста
  6. III. Закончите предложение по содержанию прочитанного текста.
  7. III. Материалы для подготовки и проведения занятия (тексты, информационная справка о методах, реализуемых на занятии)
  8. III. Написание текста контрольной работы
  9. III. Составьте текст факса по образцу.
  10. IV. Выпишите из текста 10 сложных существительных и определите их род.

#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 | Поможем написать вашу работу | Нарушение авторских прав

1 | <== 2 ==> |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав