готов лаби 4 курс 1 сим / Вычислительные системы / laba_4
.docxМіністерство освіти і науки, молоді та спорту України
Кіровоградський національний технічний університет
МТФ
Кафедра Програмного забезпечення
Дисципліна Обчислювальні системи
Лабораторна робота №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); }