У меня действительно очень неприятная проблема при попытке прочитать из нескольких филонов. У меня есть 1 процесс, ожидающий структуры из fifo и нескольких процессов, которые отправляют ему эти структуры по сигналу. После первого чтения я не могу читать ничего больше .. из любого сигнала. Похоже, программа застывает.Невозможно прочитать из нескольких фиксов
Процесс отправки имеет это в основном с
myfifo = '/tmp/myfifo{0}' //{0} is a number that every process has individual.
mkfifo(myfifo, 0666);
fd = open(myfifo, O_WRONLY);
write(fd, &demon1 , sizeof(demon1));
close(fd);
while (1)
{
}
и это в signal_handler
void signal_handler(int signum)
{
if (signum == SIGUSR1)
{
//some declarations here
mkfifo(myfifo, 0666);
fd = open(myfifo, O_WRONLY | O_NONBLOCK);
write(fd, &demon1 , sizeof(demon1));
}
}
Хотя процесс чтения имеет
myfifo[i] = /tmp/myfifo{0} // {0} is i which is the number of process that sends.
while(1)
{
for(i=0;i<n;i++)
{
fd = open(myfifo[i], O_RDONLY | O_NONBLOCK);
r = read(fd, &demon1, sizeof(demon1));
if(r > 1)
{
//printf struct elements
}
}
}
Пришлите минимальный рабочий пример. Вы, например, закрываете каждый fd снова после открытия в процессе _reading? В противном случае у вас скоро закончится файловый дескриптор – Ctx
это по большей части - это все, что нужно для печати и настройки каталогов. – Thomas
Я предлагаю прочитать вывод 'man 7 fifo', в частности, часть об открытии FIFO в режиме без блокировки. Я думаю, что ваш «только открытый», неблокирующий 'open' будет с ошибкой 'ENXIO', когда другой конец FIFO не будет открыт. –