1. Белецкий Я. Энциклопедия языка Си / Я. Белецкий, пер. с пол. А. Д. Плитман, ред. Ф. Ф. Пащенко. - М.: Мир, 1992. - 686 c.
2. Бондаренко М. Ф. Системное программирование в современных операционных системах: учебное пособие для студентов вузов / М. Ф. Бондаренко [и др.]. - Харьков: Компания СМИТ, 2005. - 432 с.
3. Бек Л. Введение в системное программирование / Л. Л. Бек; Ред. Л. Н. Королев, Пер. с англ. Н. А. Богомолов. - М.: Мир, 1988. - 448 с.
Приложение а
(справочное)
текст программы lr6_client
* Программа клиент осуществляющая связь через FIFO */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int fd1,fd2, result, c, f, b, n;
char reg[1];
size_t size;
unsigned short mas[4]; /* массив для передачи по каналу */
int nmas = sizeof mas; /* количество байт, занимаемых массивом */
unsigned short pack_word[1];/* массив для упакованного числа */
int nmas_pack = sizeof pack_word; /* количество байт, занимаемых массивом упа-кованным*/
char name1[]= "a.fifo"; /* имя канала для записи */
char name2[]= "b.fifo"; /* имя канала для чтения */
/* Обнуляем маску создания файлов текущего процесса для того,
чтобы права доступа у создаваемого FIFO точно соответствовали
параметру вызова mknod() */
(void)umask(0);
/* главный цикл */
while(1){
printf("Введите код режима работы (u / p) >");
scanf("%s",®);
printf("Введите код состояния (0 - 31) >");
scanf("%hd",&c); mas[0]=c;
printf("Введите признак ошибки (0 / 1) >");
scanf("%hd",&f); mas[1]=f;
printf("Введите признак занятости (0 / 1) >");
scanf("%hd",&b); mas[2]=b;
printf("Введите кол-во переданных байт (0 - 255) >");
scanf("%hd",&n); mas[3]=n;
/* открываем FIFO на запись.*/
if((fd1 = open(name1, O_WRONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for writing\n");
exit(-1);
}
/* Пробуем записать в FIFO nmas байт */
size = write(fd1, mas, nmas);
if(size!= nmas){
/* Если записалось меньшее количество байт,то сообщаем
об ошибке и завершаем работу */
printf("Can\'t write all string to FIFO\n");
exit(-1);
}
/* Закрываем входной поток данных и на этом родитель
прекращает работу */
close(fd1);
/* Открываем
FIFO на чтение.*/
if((fd2 = open(name2, O_RDONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for reading\n");
exit(-1);
}
/* Пробуем прочитать из FIFO в массив */
size = read(fd2, pack_word, nmas_pack);
if(size < 0){
/* Если прочитать не смогли, сообщаем об ошибке
и завершаем работу */
printf("Can\'t read string\n");
exit(-1);
}
/* Печатаем прочитанную строку */
printf("%hu\n",pack_word[0]);
/* Закрываем входной поток и завершаем работу */
close(fd2);
}
printf("client exit\n");
return 0;
}
Приложение Б
(справочное)
Текст программы lr6_server
/* Программа сервер, осуществляющая связь через FIFO */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int fd1, fd2, result;
size_t size;
unsigned short mas[4]; /* массив для принятого набора чисел */
int nmas = sizeof mas; /* количество байт, занимаемых массивом */
unsigned short pack_word[1];/* массив для упакованного числа */
int nmas_pack = sizeof pack_word; /* количество байт, занимаемых массивом упакованным*/
char name1[]="a.fifo";
char name2[]="b.fifo";
/* Обнуляем маску создания файлов текущего процесса для того,
чтобы права доступа у создаваемого FIFO точно соответствовали
параметру вызова mknod() */
(void)umask(0);
/*Если файлы с таким именем существует, удалим их*/
unlink("a.fifo");
unlink("b.fifo");
/* Попытаемся создать FIFO с именем a.fifo в текущей
директории */
if(mknod(name1, S_IFIFO | 0666, 0) < 0){
/* Если создать FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t create a.FIFO\n");
exit(-1);
}
/* Попытаемся создать FIFO с именем b.fifo в текущей
директории */
if(mknod(name2, S_IFIFO | 0666, 0) < 0){
/* Если создать FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t create b.FIFO\n");
exit(-1);
}
while(1){
/* Открываем
FIFO на чтение.*/
if((fd1 = open(name1, O_RDONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for reading\n");
exit(-1);
}
/* открываем FIFO на запись.*/
if((fd2 = open(name2, O_WRONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for writing\n");
exit(-1);
}
/* Пробуем прочитать из FIFO nmas байт в массив */
size = read(fd1, mas, nmas);
if(size <= 0){
/* Если прочитать не смогли, сообщаем об ошибке
и завершаем работу */
printf("Can\'t read \n");
exit(-1);
}
pack_word[0]=(mas[0]&0x1F)<<11;
pack_word[0]|=(mas[1]&1)<<9;
pack_word[0]|=(mas[2]&1)<<8;
pack_word[0]|= mas[3]&0xFF;
/* Пробуем записать в FIFO nmas_pack байт */
size = write(fd2, pack_word, nmas_pack);
if(size!= nmas_pack){
/* Если записалось меньшее количество байт,то сообщаем
об ошибке и завершаем работу */
printf("Can\'t write to FIFO\n");
exit(-1);
}
/* Закрываем */
close(fd1);
close(fd2);
}
printf(" server exit\n");
return 0;
}
Заказ №____ от «___» __________20__г. Тираж_____экз.
Изд-во СевГУ