<<
>>

Прогон программы с FIFO в родственных процессах

Для иллюстрации взаимодействия процессов через FIFO рассмотрим такую программу:

/* Программа 05-4.с, осуществляющая однонаправленную связь через FIFO между процессом-родителем и процессом-ребенком */

#include

#include

#include

#include

#include int main(){

int fd, result; size_t size; char resstring[14]; char name[]="aaa.fifo" ;

/* Обнуляем маску создания файлов текущего процесса для того, чтобы права доступа у создаваемого FIFO точно соответствовали параметру вызова mknod() */ (void)umask(0) ;

/* Попытаемся создать FIFO с именем aaa.fifo в текущей директории */

if(mknod(name, S_IFIFO I 0666, 0) < 0){

/* Если создать FIFO не удалось, печатаем об этом сообщение и прекращаем работу */ printf(”Can\'t create FIFO\n”); exit(-1);

}

/* Порождаем новый процесс */ if((result = fork()) < 0){

/* Если создать процесс не удалось, сообщаем об этом и завершаем работу */ printf("Can\'t fork child\n"); exit(-1);

} else if (result > 0) {

/* Мы находимся в родительском процессе, который будет передавать информацию процессу-ребенку.

В этом процессе открываем FIFO на запись.*/ if((f d = open(name, 0_WR0NLY)) < 0){

/* Если открыть FIFO не удалось, печатаем об этом сообщение и прекращаем работу */ printf("Can\1t open FIFO for writing\n");

exit(-1) ;

}

/* Пробуем записать в FIFO 14 байт, т.е.

всю строку "Hello, world!" вместе с признаком конца строки */

size = write(fd, "Hello, world!", 14); if(size != 14 ) {

/* Если записалось меньшее количество байт, то сообщаем об ошибке и завершаем работу */

printf("Can\'t write all string to FIFO\n"); exit(-1);

}

/* Закрываем входной поток данных и на этом родитель прекращает работу */ close(fd);

printf("Parent exit\n");

} else {

/* Мы находимся в порожденном процессе, который будет получать информацию от процесса-родителя. Открываем FIFO на чтение.*/ if((fd = open(паше, 0_RD0NLY)) < 0){

/* Если открыть FIFO не удалось, печатаем об этом сообщение и прекращаем работу */ printf("Can\'t open FIFO for reading\n"); exit(-1) ;

}

/* Пробуем прочитать из FIFO 14 байт в массив, т.е.

всю записанную строку */ size = read(fd, resstring, 14); if(size < 0){

/* Если прочитать не смогли, сообщаем об ошибке

и завершаем работу */

printf("Can\'t read string\n");

exit(-1);

}

/* Печатаем прочитанную строку */ printf("%s\n",resstring);

/* Закрываем входной поток и завершаем работу */ close(fd);

}

return 0;

}

Наберите программу, откомпилируйте ее и запустите на исполнение. В этой программе информацией между собой обмениваются процесс-родитель и процесс-ребенок. Обратим внимание, что повторный запуск этой программы приведет к ошибке при попытке создания FIFO, так как файл с заданным именем уже существует. Здесь нужно либо удалять его перед каждым прогоном программы с диска вручную, либо после первого запуска модифицировать исходный текст, исключив из него все, связанное с системным вызовом mknod (). С системным вызовом, предназначенным для удаления файла при работе процесса, мы познакомимся позже (на семинарах 11 — 12) при изучении файловых систем.

<< | >>
Источник: В.Е. Карпов К.А. Коньков. Основы операционных систем. 2005

Еще по теме Прогон программы с FIFO в родственных процессах:

  1. Программа курса "Модели социальных процессов"
  2. Родственная душа
  3. Статья 184. Вещи, определенные индивидуальными или родственными признаками
  4. Приложение к шестой главе. Особенные права и обязанности, возникающие из семейных и родственных отношений.
  5. Программа Да и программа Нет
  6. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ
  7. Очерк 2: Берт «Процесс — вот мое достояние. Именно процесс создает успех»
  8. Музыкальные концертные программы
  9. Программа телевидения
  10. Г л а в а 9 О ПРОГРАММАХ
  11. Установка программы Астропроцессор ZET
  12. ПРОЕКТНЫЙ И ИСПОЛНИТЕЛЬНЫЙ УРОВНИ ПРОГРАММ