
Л.р. №4 (InterProcess Communication UNIX )
.docМОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Кафедра кибернетики
Лабораторная работа №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!