Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#define FIFO_NAME "/tmp/my_fifo"int main(int argc, char *argv[]) { int res; int open_mode = 0; int i; if (argc < 2) { fprintf(stderr, "Usage: %s <some combination of O_RDONLY O_WRONLY O_NONBLOCK>n", *argv); exit(EXIT_FAILURE); }2. Полагая, что программа передает тестовые данные, вы задаете параметр
open_mode for(i = 1; i <argc; i++) { if (strncmp(*++argv, "O_RDONLY", 8) == 0) open_mode |= O_RDONLY; if (strncmp(*argv, "O_WRONLY", 8) == 0) open_mode |= O_WRONLY; if (strncmp(*argv, "O_NONBLOCK", 10) == 0) open_mode |= O_NONBLOCK; }3. Далее проверьте, существует ли канал FIFO, и при необходимости создайте его. Затем FIFO открывается, и пока программа засыпает на короткое время, выполняется результирующий вывод. В заключение FIFO закрывается.
if (access(FIFO_NAME, F_OK) == -1) { res = mkfifo(FIFO_NAME, 0777); if (res != 0) { fprintf(stderr, "Gould not create fifo %sn", FIFO_NAME); exit(EXIT_FAILURE); } } printf("Process %d opening FIF0n", getpid()); res = open(FIFO_NAME, open_mode); printf("Process %d result %dn", getpid(), res); sleep(5); if (res != -1) (void)close(res); printf("Process %d finishedn", getpid()); exit(EXIT_SUCCESS);}Как это работает
Эта программа позволяет задать в командной строке комбинации значений
O_RDONLYO_WRONLYO_NONBLOCK|=accessНикогда не уничтожайте FIFO, т.к. у вас нет способа узнать, не использует ли FIFO другая программа.
Теперь у вас есть тестовая программа, и вы можете проверить комбинации пар. Обратите внимание на то, что первая программа, считыватель, помещена в фоновый режим.
$ <b>./fifo2 O_RDONLY &</b>[1] 152Process 152 opening FIFO$ <b>./fifo2 O_WRONLY</b>Process 153 opening FIFOProcess 152 result 3Process 153 result 3Process 152 finishedProcess 153 finishedЭто, наверное, самое распространенное применение именованных каналов. Оно позволяет читающему процессу стартовать и ждать в вызове
openopenКогда процесс в ОС Linux заблокирован, он не потребляет ресурсы ЦП, поэтому этот метод синхронизации очень эффективен с точки зрения использования ЦП.
В следующем примере читающий процесс выполняет вызов
openopen$ <b>./fifо2 O_RDONLY O_NONBLOCK &</b>[1] 160Process 160 opening fifo$ <b>./fifo2 O_WRONLY</b>Process 161 opening FIFOProcess 160 result 3Process 161 result 3Process 160 finishedProcess 161 finished[1]+ Done ./fifo2 O_RDONLY O_NONBLOCKЭти два примера — вероятно, самые распространенные комбинации режимов
openПрименение режима
O_NONBLOCKreadwriteВызов
readO_NONBLOCKreadВызов
writewrite
