@Naxalenok

Бесконечный запрос ввода при вызове open()?

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#include <string.h>

int main(){
    int fd;
    size_t size;
    char name[]="aaa.fifо";
    umask(0) ;// Обнуляем маску создания файлов текущего процесса для того, чтобы права доступа у создаваемого FIFO точно соответствовали параметру вызова mknod()
    // Попытаемся создать FIFO с именем aaa.fifo в текущей директории
    if (mknod(name, S_IFIFO | 0666, 0) < 0){ 
        // Если создать FIFO не удалось, печатаем об этом сообщение и прекращаем работу 
        printf("Can\'t create FIFO\n");
        _exit(-1);
    }
    if ((fd = open(name, O_WRONLY)) < 0){ // открывает aaa.fifo
        //  Если открыть FIFO не удалось, печатаем об этом сообщение и рекращаем работу 
        printf("Can\'t open FIFO for writing\n");
        _exit(-1);
    }
    char message[60];
    while(true){
        message[0] = 0;
        std::cin.clear();
        std::cin >> message;// читаем сообщения из консоли
        if(!strcmp(message,"exit")) // если обнаружен,exit выходим из цикла
        {
            printf("Exit to programm\n");
            break;
        }
        size = write(fd, message, 60); // 1 - это /0
        if (size < strlen(message)) { // Если записалось меньшее количество байт, то сообщаем об ошибке и завершаем работу
            printf("Can\'t write all string to FIFO\n");
            _exit(-1);
        }
    }
    close(fd);// Закрываем поток 
    
    return 0;
}


Путем тыка понял, что проблема возникает при вызове open()
614720aa89793582985463.png
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
понял, что проблема возникает при вызове open()

Правильно понял. Цитата из man 7 fifo:
Normally, opening the FIFO blocks until the other end is opened also.

Чтобы вызов open вернулся и программа продолжила выполняться нужно открыть второй конец fifo на чтение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AntonSazonov
У вас бесконечный запрос ввода потому что у вас бесконечный ввод в цикле, который прерывается при вводе "exit".
Собственно, в чём вопрос то?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы