Linux 为什么从FIFO读取时会收到错误消息?

Linux 为什么从FIFO读取时会收到错误消息?,linux,server,client,fifo,Linux,Server,Client,Fifo,在操作系统介绍课程中,我们被要求使用FIFO构建客户机-服务器模型。作为客户端,我们向服务器发送一个字符串,服务器获取该字符串,如果存在具有该名称的文件,它将返回该文件的第一行。如果文件不存在或确实存在,但恰好为空,则会发回一个空字符串 问题是,在只工作一次的情况下,我发送file1,例如,服务器发回第一行,当我在同一“会话”中再次发送file1或另一个文件名时,printf(“文件%s的第一行:\n%s\n”,name,recived)没有发生,它进入if(read(fifo_serv_cli

在操作系统介绍课程中,我们被要求使用FIFO构建客户机-服务器模型。作为客户端,我们向服务器发送一个字符串,服务器获取该字符串,如果存在具有该名称的文件,它将返回该文件的第一行。如果文件不存在或确实存在,但恰好为空,则会发回一个空字符串

问题是,在只工作一次的情况下,我发送file1,例如,服务器发回第一行,当我在同一“会话”中再次发送file1或另一个文件名时,
printf(“文件%s的第一行:\n%s\n”,name,recived)没有发生,它进入
if(read(fifo_serv_client,recived,sizeof(recived))==-1{printf(“发生错误。\n”);}

你知道这是为什么吗?我试着用同一个文件做了两次,所以它100%存在,但我仍然得到相同的结果

非常感谢你

以下是客户端的代码:

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

#define BUFSIZE 512

int main()
{
   int fifo_client_serv;
   char *fifo1 = "fifo_client_serv";

   int fifo_serv_client;
   char *fifo2 = "fifo_serv_client";

   char name[BUFSIZE];

   while(1) {
      printf("Write the file's name: ");
      scanf("%s", name);

      /* write str to the FIFO */
      fifo_client_serv = open(fifo1, O_WRONLY);
      fifo_serv_client = open(fifo2, O_RDONLY);
      write(fifo_client_serv, name, sizeof(name));

      char recived[BUFSIZE];

      if (read(fifo_serv_client, recived, sizeof(recived)) == -1) {
         printf("An error occurred.\n");
      } else {
         printf("First line of the file %s: \n%s\n", name, recived);
         close(fifo_client_serv);
         close(fifo_serv_client);

      }
   }

   return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义BUFSIZE 512
int main()
{
国际先进先出客户服务;
char*fifo1=“先进先出客户服务”;
国际先进先出服务客户端;
char*fifo2=“先进先出服务客户机”;
字符名[BUFSIZE];
而(1){
printf(“写文件名:”);
scanf(“%s”,名称);
/*将str写入FIFO*/
fifo_客户端_服务=打开(仅限fifo1、O_);
fifo_serv_client=打开(仅限fifo2,O_RDONLY);
写入(先进先出客户服务,名称,大小(名称));
字符接收[BUFSIZE];
如果(读取(先进先出服务客户端,接收,sizeof(接收))=-1){
printf(“发生错误。\n”);
}否则{
printf(“文件%s的第一行:\n%s\n”,名称,已接收);
关闭(先进先出客户服务);
关闭(先进先出服务客户端);
}
}
返回0;
}
下面是服务器的代码:

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

#define BUFSIZE 512

int main()
{
   int fifo_client_serv;
   char *fifo1 = "fifo_client_serv";

   int fifo_serv_client;
   char *fifo2 = "fifo_serv_client";

   char buf[BUFSIZE];
   char line[BUFSIZE];

   FILE *file;

   /* create the FIFO (named pipe) */
   mkfifo(fifo1, 0777);
   mkfifo(fifo2, 0777);
   
   printf("Server runnning...\n");

   while (1)
   {
      fifo_client_serv = open(fifo1, O_RDONLY);
      fifo_serv_client = open(fifo2, O_WRONLY);
      read(fifo_client_serv, buf, BUFSIZE); 
       
      if((file = fopen(buf, "r")) == NULL) {
         write(fifo_serv_client, "", BUFSIZE);
      } else {
         fgets(line, BUFSIZE, file);
         write(fifo_serv_client, line, BUFSIZE);
      }

      /* clear buffer and line */
      memset(buf, 0, sizeof(buf));
      memset(line, 0, sizeof(buf));

      close(fifo_client_serv);
      close(fifo_serv_client);

      unlink(fifo1);
      unlink(fifo2);
   }

   return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义BUFSIZE 512
int main()
{
国际先进先出客户服务;
char*fifo1=“先进先出客户服务”;
国际先进先出服务客户端;
char*fifo2=“先进先出服务客户机”;
字符buf[BUFSIZE];
字符行[BUFSIZE];
文件*文件;
/*创建FIFO(命名管道)*/
mkfifo(fifo10777);
mkfifo(fifo2,0777);
printf(“服务器运行…\n”);
而(1)
{
fifo_客户端_服务=打开(仅fifo1,O_RDONLY);
fifo_serv_客户端=打开(仅限fifo2、O_);
读取(先进先出客户机服务、buf、BUFSIZE);
if((file=fopen(buf,“r”))==NULL){
写入(先进先出服务客户端,”,BUFSIZE);
}否则{
fgets(行、BUFSIZE、文件);
写入(先进先出服务客户端、行、BUFSIZE);
}
/*清除缓冲区和行*/
memset(buf,0,sizeof(buf));
memset(line,0,sizeof(buf));
关闭(先进先出客户服务);
关闭(先进先出服务客户端);
取消链接(fifo1);
取消链接(fifo2);
}
返回0;
}

更新我发现了为什么会发生这种情况,如果我在内部创建fifo,而它工作正常!我只是把
mkfifo(fifo10777);mkfifo(fifo2,0777)中间的第一个。我的问题是,每次我从客户端发送文本时,是否真的需要创建FIFO?我不能只创建一次FIFO,从它进行通信并在完成后关闭吗?

在读取/写入服务器文件后,您能尝试关闭该文件吗

if((file = fopen(buf, "r")) == NULL) {
     write(fifo_serv_client, "", BUFSIZE);
     fclose(file);
} else {     
     fgets(line, BUFSIZE, file);
     write(fifo_serv_client, line, BUFSIZE);
     fclose(file);
}

顺便说一下。对
写入进行错误检查是值得的

仍然发生同样的情况,我错误检查了cllient和服务器中的每次写入,并且当我第二次输入
写入的名称时(fifo_client_serv,name,sizeof(name))