Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. I)Однофакторный дисперсионный анализ (выполняется с применением программы «Однофакторный дисперсионный анализ» надстройки «Анализ данных» пакета Microsoft Excel).
  2. II. Структура программы
  3. III. Ожидаемый результат реализации программы
  4. IV. Этапы внедрения программы
  5. quot;Чай освежает тело, укрепляет дух, смягчает сердце, пробуждает мысли, прогоняет леность". Восточный философ и врач Ибн Сина
  6. А) ЗАДАНИЯ ПО ОСНОВНЫМ РАЗДЕЛАМ ПРОГРАММЫ
  7. Аграрные программы основных политических партий России
  8. Анализ комплексной программы по ФВ.
  9. Анализ, компиляция и прогон программы для создания memory mapped файла и записи его содержимого
  10. Анимационные программы в туризме

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

/* Программа 3-4.с, осуществляющая однонаправленную связь через

FIFO между процессом-родителем и процессом-ребенком */

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdio.h>

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 | 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((fd = open(name, O_WRONLY)) < 0){

/* Если открыть FIFO не удалось, печатаем об этом

сообщение и прекращаем работу */

printf("Can\'t 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(name, O_RDONLY)) < 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;

}

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

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




Дата добавления: 2014-12-19; просмотров: 96 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.011 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав