2016-12-11 4 views
0

Я использую FIFO для обмена двумя процессами.
читайте fifo: почему он блокирует, а затем не блокирует

//client: 
const char * msg = "Hello, I'm cleint1."; 
const char * fifoName = "../server/fifo.tmp"; 
int fd = open(fifoName, O_WRONLY); 
write(fd, msg, strlen(msg) + 1); 
close(fd); 



//server: 
char msg[100]; 
const char * fifoName = "fifo.tmp"; 
mkfifo(fifoName, 0666); 
int fd = open(fifoName, O_RDONLY); 
while(read(fd, msg, 100) > 0) 
{ 
    std::cout<<"msg received: "<<msg<<std::endl; 
} 
close(fd); 
unlink(fifoName); 


Сервер первый блок там ждать некоторых сообщений в fifoName. Когда некоторые сообщения идут (клиент выполняется), сервер читает их, а затем цикл завершается.

Теперь я смущен. Потому что я не могу понять, почему в первый раз, когда сервер вызывает read, и он блокирует его тогда, когда он снова вызывает read, и он больше не блокируется.

Я печатаю возвращаемое значение read, и я получаю 0 после получения первого сообщения.

Что мне нужно, чтобы каждый раз блокировать read, чтобы сервер мог получать любое сообщение, как только какой-либо клиент отправляет сообщения.

+0

Вы должны распечатать strerror (errno), чтобы узнать, что такое ошибка. –

+0

@SumitGemini, я печатаю возврат 'read', и я получаю 0. – Yves

+0

, так что вы хотите, чтобы ваш сервер работал бесконечно? читать непрерывно? –

ответ

0

вы можете просто повторить чтение. Например

int iResult; 

do 
{ 
    iResult = read(fd, buffer, size); 
    if (0 == iResult) 
    { 
      // Skip to the end of the do loop 
      continue; 
    } 
     // Handle real errors 
} while (!condition); 
1

Вы получили 0 в качестве индикатора нет больше данных осталось, и не будет больше данных, с другой стороны трубы был закрыт.

Я предполагаю, что вы хотите, чтобы сервер придерживался и обрабатывал несколько клиентов, возможно, даже в одно и то же время.

Трубы в основном непригодны для этой цели. Вы хотите использовать unix-сокеты.

Наконец, петли, как это:

while(read(fd, msg, 100) > 0) 
{ 
    std::cout<<"msg received: "<<msg<<std::endl; 
} 

в корне неправильно. очень легко получить сообщение об ошибке из-за поступления сигнала.

Также обратите внимание, что вы нарушаете DRY, повторяя «100» для размера буфера, в отличие от, например, используя sizeof (msg).