Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
05.06.2015
Размер:
27.19 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України

Кіровоградський національний технічний університет

МТФ

Кафедра Програмного забезпечення

Дисципліна Обчислювальні системи

Лабораторна робота №4

Тема:Організаціяканалівміжпроцесами.

Виконав ст. гр. КІ-10-1

Перевірив викладач

Минайленко Р.М.

Кіровоград 2013

Завдання до виконання лабораторної роботи

2.1 Виконайте програму рис.1.1, яка створює канал, записує в нього три повід., а потім зчитує їх з каналу.

Проаналізуйте цю програму та намалюйте взаємозв’язок між функціями write() read().

2.2 Виконайте програму рис.1.2. Проаналізуйте її дії та намалюйте діаграму взаємодії між батьківським та породженим процесами.

Які недоліки має ця программа?

2.3 Виконайте програму рис.1.3. Проаналізуйте її та намалюйте діаграму взаємодії між процесами. Вкажіть на механізи, які усувають недоліки двох попередніх програм.

2.4 У останньому прикладі канал використовувався для встановлення зв’язку між батьківським та породженим процесами. Але дескриптори файлів можуть передаватися і скрізь декілька викликівfork. Це значить, що декілька процесів можуть писати у канал та декілька процесів можуть читати з нього. Напишіть програму, яка створює три процеси, два з яких виконують записи у канал, а один – читання з нього.

2.5 Для встановлення двохстороннього зв’язку між процесами можна створити два канали, які працюють у різних напрямках. Придумайте можливість діалогу між процесами та реалізуйте його за допомогою двох каналів.

2.1

#include<unistd.h>

#include<stdio.h>
#defineMSGSIZE16
char*msg1="messagefirst#1";
char*msg2="messagesecond#2";
char*msg3="messagethird#3";
main()
{
charinbuf[MSGSIZE];
intp[2],j;
/*Відкритиканал*/
if(pipe(p)==-1)
{
perror("Errormessagepipe");
exit(1);
}
/*Записуканал*/
write(p[1],msg1,MSGSIZE);
write(p[1],msg2,MSGSIZE);
write(p[1],msg3,MSGSIZE);
/*Читаннязканалу*/
for(j=0;j<3;j++)
{
read(p[0],inbuf,MSGSIZE);
printf("%s\n",inbuf);
}
exit(0);
}


2.2

#include<unistd.h>

#include<stdio.h>
#defineMSGSIZE16
char*msg1="messagefirst#1";
char*msg2="messagesecond#2";
char*msg3="messagethird#3";
main(){
charinbuf[MSGSIZE];
intp[2],j;
pid_tpid;
/*Відкритиканал*/
if(pipe(p)==-1)
{
perror("Errormessagepipe");
exit(1);
}
switch(pid=fork())
{
case-1:
perror("Errormessagefork");
exit(2);
case0:
write(p[1],msg1,MSGSIZE);
write(p[1],msg2,MSGSIZE);
write(p[1],msg3,MSGSIZE);
break;
default:;
for(j<0;j<3;j++)
{
read(p[0],inbuf,MSGSIZE);
printf("%s\n",inbuf);
}
wait(NULL);
}
exit(0);
}

2.3

#include<unistd.h>
#include<stdio.h>
#defineMSGSIZE16
char*msg1="messagefirst#1";
char*msg2="messagesecond#2";
char*msg3="messagethird#3";
main()
{
charinbuf[MSGSIZE];
intp[2],j;
pid_tpid;
if(pipe(p)==-1)
{
perror("Errormessagepipe");
exit(1);
}
switch(pid=fork())
{
case-1:
perror("Errormessagefork");
exit(2);
case0:
close(p[0]);
write(p[1],msg1,MSGSIZE);
write(p[1],msg2,MSGSIZE);
write(p[1],msg3,MSGSIZE);
break;
defaul:;
close(p[1]);
for(j<0;j<3;j++)
{
read(p[0],inbuf,MSGSIZE);
printf("%s\n",inbuf);
}
wait(NULL);
}
exit(0);
}

2.4

#include<unistd.h>
#include<stdio.h>
#defineMSGSIZE16
char*msg1="messagefirst#1";
char*msg2="messagesecond#2";
char*msg3="messagethird#3";
main()
{
charinbuf[MSGSIZE];
intp[2],j;
pid_tpid,pid1;
if(pipe(p)==-1)
{
perror("Errormessagepipe");
exit(1);
}
switch(pid=fork())
{
case-1:
perror("Errormessagefork");
exit(2);
case0:
close(p[0]);
write(p[1],msg1,MSGSIZE);
write(p[1],msg2,MSGSIZE);
write(p[1],msg3,MSGSIZE);
switch(pid1=fork())
{
case-1:
perror("Errormessagefork");
exit(2);
case0:
close(p[0]);
write(p[1],msg1,MSGSIZE);
write(p[1],msg2,MSGSIZE);
write(p[1],msg3,MSGSIZE);
break;
default:;
wait(NULL);
}
break;
default:;
close(p[1]);
for(j<0;j<3;j++)
{
read(p[0],inbuf,MSGSIZE);
printf("%s\n",inbuf);
}
wait(NULL);
}
exit(0);
}

2.5

#include<unistd.h>
#include<stdio.h>
#defineMSGSIZE16
char*msg1="messagefirst#1";
char*msg2="messagesecond#2";
char*msg3="messagethird#3";
main()
{
charinbuf[MSGSIZE];
intp[2],pp[2],j;
pid_tpid,p1,pp1;
if(pipe(p1)==-1)
{
perror("Errormessagepipe1");
exit(1);
}
if(pipe(pp1)==-1)
{
perror("Errormessagepipe2");
exit(1);
}
close(p[0]);
write(p[1],msg1,MSGSIZE);
write(p[1],msg2,MSGSIZE);
write(p[1],msg3,MSGSIZE);
switch(pid=fork())
{
case-1:
perror("Errormessagefork");
exit(2);
case0:
close(pp[0]);
write(pp[1],msg1,MSGSIZE);
write(pp[1],msg2,MSGSIZE);
write(pp[1],msg3,MSGSIZE);
printf("%s\nMessagesfromtheFather");
close(p[1]);
for(j<0;j<3;j++)
{
read(p[0],inbuf,MSGSIZE);
printf("%s\n",inbuf);
}
break;
default:;
printf("%s\nMessagesfromtheChild");
close(pp[1]);
for(j<0;j<3;j++)
{
read(pp[0],inbuf,MSGSIZE);
printf("%s\n",inbuf);
}
wait(NULL);
}
exit(0);
}

Соседние файлы в папке Вычислительные системы