2016-12-11 143 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

应打印字符串错误(错误),看看是什么错误。 –

+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)。