0

伙计们!我正在尝试制作我的第一个使用命名管道或 fifo 的程序。客户端向服务器发送正整数。当发送负数时,传输关闭。服务器确定发送的最小数量、最大数量并将这两个值发送回客户端。我遇到的麻烦是打印的最大值和最小值总是为零,我真的不知道如何解决这个问题。这是我到目前为止所拥有的:

客户端.c

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

main(){
  int f1,f2;
  int n,a,b;
  printf("Give the number: ");
  scanf("%d",&n);
  while(n >= 0){
    printf("Give the number: ");
    scanf("%d",&n);
  }
  f1=open("fifo1",O_WRONLY);
  f2=open("fifo2",O_RDONLY);
  if(f1<0){
    printf("You can't write in the fifo client");
  }
  if(f2<0){
  printf("You can't read from the fifo client");
  }
  write(f1,&n,sizeof(int));
  read(f2,&a,sizeof(int));
  read(f2,&b,sizeof(int));
  printf("The minimum number is %d\n",a);
  printf("The maximum number is %d\n",b);
  close(f2);
  close(f1);
}

服务器.c

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

int minim=0;
int maxim=0;

int min(int n){
if(n>=0 && minim > n){
minim=n;
}
return minim;
}

int max(int n){
if (n > maxim){
maxim=n;
}
return maxim;
}


main(){
  int f1,f2,a,b,n;
  f1=open("fifo1",O_RDONLY);
  f2=open("fifo2",O_WRONLY);
  if(f1<0){
    printf("error");
  }
  if(f2<0){
    printf("error");
  }
  read(f1,&n,sizeof(int));
  a = min(n);
  b = max(n);
  write(f2,&a,sizeof(int));
  write(f2,&b,sizeof(int));
  close(f1);
  close(f2);
}
4

1 回答 1

2

这是一个非常简单的解决方案。

对于 1,您需要使用 mkfifo 制作 fifo。如果您之前在单独的程序中执行过此操作,或者该文件已经存在,但没有它,您将一无所获。

对于 2,当您在文件已写入的服务器上读取时,没有 gaurentee。如果客户端首先运行,那么您需要刷新您的 write 调用以确保首先写入 fifo。这可以通过 fsync() 来完成。在该文件描述符上使用 fsync() 后,该文件将被写入,并且您可以保证这些值将在那里供服务器读取。通过让服务器读取 fifo 然后输出它读取的内容来验证这一点。

于 2013-05-10T19:00:25.770 回答