Linux环境C语言双应用FIFO通信服务端无数据接收问题求助
FIFO跨进程通信无数据问题修复方案
核心问题点
- 客户端输出缓冲未刷新:客户端代码中
fflush(scriere);被注释了。C语言标准IO函数默认启用用户态缓冲,写入FIFO的内容会暂存在进程本地缓冲,没有主动刷入内核FIFO文件,服务端自然读不到数据。 - 服务端文件描述符判断逻辑错误:服务端打开写FIFO的代码后,错误复用了读FIFO的判断逻辑:
该bug会导致写FIFO打开失败时无法被检测到,进而引发后续写入失败。scriere = fopen(fisierFifoScriere, "w"); if(citire == NULL){ // 这里应该判断scriere是否为NULL perror("Eroare la deschiderea fisierului: "); return 1; } - 双端读写逻辑不匹配:
- 客户端读取服务端返回用
fgets,该函数默认读到换行符才会返回,但服务端写入返回内容时仅写了"test "没有加换行符,会导致客户端读操作一直阻塞。 - 客户端读返回用了
while(fgets(...))循环,该循环只有在FIFO对端关闭、读到EOF时才会退出,正常通信场景下会导致客户端永远卡在读取逻辑,无法处理下一次用户输入。
- 客户端读取服务端返回用
- 命令无分隔符易粘包:写入命令时没有加明确的分隔符,多条命令连续写入时会出现粘包,导致服务端
fscanf读取异常。
修复步骤
- 取消客户端代码中
//fflush(scriere);的注释,每次写完命令主动刷新缓冲。 - 修正服务端写FIFO的判断逻辑,将
if(citire == NULL)改为if(scriere == NULL)。 - 服务端每次写入返回内容时末尾加换行符,例如修改为
fprintf(scriere, "%s\n", "test");。 - 客户端读取单次返回时去掉外层while循环,直接调用一次
fgets即可,无需循环读直到EOF。 - 建议客户端写入每条命令时末尾加换行符,避免命令粘包。
内容的提问来源于stack exchange,提问作者HelpMePLs
相关产品推荐
相关产品推荐

