Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа по дисциплине «Математическое обеспечение ЭВМ» на тему «InterProcess Communication UNIX»

.doc
Скачиваний:
3
Добавлен:
20.05.2014
Размер:
43.52 Кб
Скачать

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

Кафедра кибернетики

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

по дисциплине

«Математическое обеспечение ЭВМ»

на тему: « InterProcess Communication UNIX »

Выполнила студентка группы М-75

Катышева С.Н.

Проверил проф. д.т.н.

Гостев И.М.

Москва 2009

Задание: Продемонстрировать навыки работы с подсистемой межпроцессорного взаимодействия на примере программы на языке С.

Программа на языке С реализует следующую задачу:

Программа осуществляет однонаправленную связь через неименованный канал между родительским и дочерним процессом. В дочернем процессе в pipe записывается 20 чисел, вводимых с клавиатуры, родительский процесс получает эти числа и выводит их сумму на экран.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <unistd.h>

#include <sys/types.h>

int main()

{

int fd[2],pid,i,j,size;

int mas[20];

if(pipe(fd) < 0) /*Создание pipe*/

{

printf("Error: pipe not created!\n");

exit(1);

}

pid = fork(); /*Создание дочернего процесса*/

if(pid < 0)

{

printf("Error: process not created!!\n");

exit(1);

}

else

{

if (!pid) /*блок программы, выполняемый в дочернем процессе */

printf("\nRabotaet dochernij’ process \n");

{

/* дочерний процесс будет передавать информацию*/

close(fd[0]); /*родительскому, выходной поток данных не нужен*/

printf("vvedite 20 chisel, razdel'aj'a ih probelami i nazhmite Enter:\n");

for (i=0; i<20; i++)

{

scanf("%d",&mas[i]);

}

size = write(fd[1], mas, 20);

if(size != 20) /* проверим, что всё поместилось в pipe*/

{

printf("Ne vse pomestilos’ v pipe!\n");

exit(1);

}

close(fd[1]); /* закрываем входной поток данных */

}

else /* блок программы, выполняемый в родительском процессе*/ {

wait(); /* ожидание завершения дочернего процесса*/

printf("\nRabotaet roditel’skij’ process \n");

// родительский процесс получает информацию от

close(fd[1]); //дочернего, входной поток данных не нужен.

size = read(fd[0],mas,20);

if(size < 0) /* проверим, что успешно прочитали из pipe */

{

printf("It is impossible to read\n");

exit(1);

}

close(fd[0]); /* закрываем выходной поток данных*/

printf("Invertirovannij' massiv:\n");

for(j=0; j<0;j++)

sum=sum+mas[j];

printf("%d ", a[j-1]); /*Вывод результатана экран*/

}

}

return 0;

}

Результат выполнения программы:

user@debian:~/temp/innokentij$ gcc ipc.c

user@debian:~/temp/innokentij $ ./a.out

Rabotaet dochernij’ process

vvedite 20 chisel, razdel'aj'a ih probelami i nazhmite Enter:

1 2 3 4 3 2 44 -6 -8 1 3 2 12 4 3 65 4 2 3 5

Rabotaet roditel’skij’ process

Invertirovannij' massiv:

5 3 2 4 65 3 4 12 2 3 1 -8 -6 44 2 3 4 3 2 1

Спасибо за помощь в написании Linux forever!

3