Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


«адача є2 - неименованные программные каналы

”правление процессами в ќ— UNIX

 

÷ель работы

ќзнакомитьс€ со средствами организации взаимодействи€ процессов в ќ— UNIX.

 

—одержание работы

  1. ќзнакомитьс€ со средствами организации взаимодействи€ процессов в ќ— UNIX.
  2. ƒл€ указанного варианта составить следующие программы на €зыке —и:
    • реализующую конвейер из двух фильтров (формулировка одного фильтра задана, второй фильтр необходимо придумать);
    • организующую взаимодействие двух процессов через неименованный программный канал;

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

ѕримечание. ѕроиллюстрировать работу неименованного программного канала и именованного программного канала на макетных программах с применением фильтров, используемых в задаче є1.

3. «ащитить лабораторную работу, ответив на контрольные вопросы.

ћетодические указани€ к лабораторной работе

 

“аблица 1. ќсновные системные вызовы, используемые в задачах

  fork() —истемный вызов, создающий новый процесс (потомок), который €вл€етс€ практически полной копией процесса-родител€, выполн€ющего этот вызов
  wait(int *status) ќжидание завершени€ процесса-потомка родительским процессом
  execl() ¬се формы системного вызова exec превращают вызвавший процесс в новый процесс, который строитс€ из обычного выполн€емого файла, называемого в дальнейшем новым выполн€емым файлом. ≈сли системный вызов exec закончилс€ успешно, то он не может вернуть управление, так как вызвавший процесс уже заменен новым процессом.
  pipe(p) p Ц целый массив из двух элементов: int p[2]; ƒескриптор файла p[0] используетс€ дл€ представлени€ конца канала, предназначенного дл€ чтени€, а дескриптор файла p[1] Ц дл€ представлени€ конца канала, предназначенного дл€ записи.
  fdopen(<дескриптор_файла> <режим_открыти€_файла>) fdopen ассоциирует поток с файловым дескриптором полученным от функции open()
  dup(p[0]) Ќаименьший доступный дескриптор файла, т.е. 0, и p[0], т.е. конец канала p дл€ чтени€, станов€тс€ синонимами
  close(0) ƒескриптор файла 0 закрываетс€ в св€зи с закрытием ассоциированного с ним файла, т.е. файла стандартного ввода

 

 

«адача є1 - конвейер из двух фильтров

 

ѕример: ѕрограммна€ реализаци€ конвейера ls | wc, подсчитывающего количество программ в текущем каталоге.

void main(void) /* LSWS.C */

/* —оздание программного канала */

/* дл€ команд ls и wc */

{

int pid, pid2;

int fd[2];

int status, dead;

switch(pid = fork())

{

case -1: /* Cбой при вызове fork() */

printf("ќшибка при вызове fork() #1 \n");

exit(1);

case 0: /* ѕќ“ќћќ  #1 */

pipe(fd);

 

switch(pid2 = fork())

{

case -1: /* Cбой при вызове fork() */

printf("ќшибка при вызове fork() #2 \n");

exit(2);

case 0: /* ѕќ“ќћќ  #2 */

close(0); dup(fd[0]); close(fd[0]); close(fd[1]);

execl("/usr/bin/wc", "wc", 0);

puts("ќшибка при вызове WC \n");

exit();

default: /* */

close(1); dup(fd[1]);

close(fd[1]); close(fd[0]);

execl("/bin/ls", "ls", 0);

puts("ќшибка при вызове LS\n");

exit();

default: /* ѕ–≈ƒќ  √Ћј¬Ќџ… */

dead = wait(&status);

exit();

}

}

 

 

«адача є2 - неименованные программные каналы

 

ѕример: взаимодействие родственных процессов в дуплексном режиме (используютс€ два программных канала) и переназначение стандартного ввода-вывода.

 

ѕусть входной файл содержит команды форматировани€ (они начинаютс€ с С.Т в первом символе строки) и текст:

.R

aaaaaaa

.B

ccccccc

...

ƒл€ решени€ задачи используем 2 параллельных процесса:

Ј textcount Ц читает текстовый файл и при передаче строк процессу count удал€ет из них команды форматировани€;

Ј count Ц подсчитывает получаемые от процесса textcount символы и по достижении конца текста посылает общее число знаков первому процессу.

ѕорождающий и порожденный процессы должны взаимодействовать, использу€ два канала p и q.

 

–ис. 1. ¬заимодействие родственных процессов в дуплексном режиме

ѕорожденный процесс выполн€ет независимо написанную программу (Count), котора€ читает данные из входного потока stdin (точка 1) и записывает их в стандартный выходной поток stdout (точка 2), т.е. использует функции getchar() и printf().

 

 

#include <stdio.h>

#define R 0 /* stdin */

#define W 1 /* stdout */

#define True 1

#define FALSE 0

#define PERIOD '.'

void main(void) /* Textcount.c */

{

int pid;

int p[2], q[2];

FILE *fdopen(), *fp;

int c;

int newline = TRUE;

int total;

 

/* ”становка программных каналов p и q */

pipe(p);

pipe(q);

/* p[R], q[R] - концы каналов дл€ чтени€ */

/* p[W], q[W] - концы каналов дл€ записи */

switch(pid = fork())

{

case 0: /* ѕќ“ќћќ  */

/* читает из p[R] */

/* пишет в q[W] */

/* p[W] и q[R] - закрыты */

/* станд. ввод и p[R] - синонимы */

/* станд. вывод и q[W] синонимы */

/*  анал P */

close(p[W]);

close(R); dup(p[R]); close(p[R]);

/* “еперь станд. ввод и p[R] - синонимы */

/*  анал Q */

close(q[R]);

close(W); dup(q[W]); close(q[W]);

 

/* “еперь станд. вывод и q[W] - синонимы */

/* «апуск внешней независимой программы Count */

execl("count", "count", 0);

printf("textcount: ќшибка при вызове");

exit(1);

case -1: /* Cбой при вызове fork() */

printf("ќшибка при вызове fork() \n");

exit(1);

default: /* Ёто ѕ–≈ƒќ  */

/*  онец канала P преобразуетс€ дл€ */

/* записи в поток */

close(p[R]); close(q[W]);

 

fp = fdopen(p[W], "w");

/* ѕосылка текстового файла в процесс COUNT */ while((c=getchar()!= EOF)

{

switch(newline)

{

case TRUE:

if (c == '\n') /* ѕуста€ строка */

putc(c, fp);

else if (c == PERIOD)

/* ѕропустить строку */

while((c=getchar()!= EOF && c!= '\n');

else

{

putc(c, fp);

newline = FALSE;

}

break;

default:

putc(c, fp);

if (c == '\n')

newline = TRUE;

}

}

fclose(fp); /* „тобы принимающий процесс мог воспринимать */

/* EOF на конце канала дл€ чтени€ */

/* “еперь подключаем ввод результата */

/* из канала Q */

close(R); dup(q[R]); close(q[R]);

scanf("%d", &total);

printf("ќбщее число знаков %d\n", total);

exit(0);

}

}

 

/* Ќезависима€ программа Count Ц подсчет символов, полученных от процесса Textcount */

 

void main(void) /* COUNT.C */

/* ѕроцесс, выполн€ющий COUNT, должен */

/* переназначить ввод и вывод так, */

/* чтобы ввод данных выполн€лс€ из канала P, */

/* а вывод - канал Q */

/* */

{

int count = 0;

while (getchar()!= EOF)

count++; printf("%d\n", count);

}

 

 



<== предыдуща€ лекци€ | следующа€ лекци€ ==>
Ћр4-с основные виды защиты, используемые в ј»“ банковской де€тельности | I ћеханические колебани€. ¬ынужденные колебани€. –езонанс
ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-11-05; ћы поможем в написании ваших работ!; просмотров: 933 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

„то разум человека может постигнуть и во что он может поверить, того он способен достичь © Ќаполеон ’илл
==> читать все изречени€...

1525 - | 1393 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.018 с.