家伙!我正在尝试制作我的第一个使用命名管道或fifo的程序。客户端向服务器发送正整数。发送负数时,传输将关闭。服务器确定发送的最小数量,最大数量,并将两个值发送回客户端。我遇到的麻烦是,打印的最大值和最小值始终为零,我真的不知道如何解决问题。这就是我到目前为止所做的:
client.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);
}
server.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);
}
答案 0 :(得分:2)
这是一个非常简单的解决方案。
对于1,你需要用mkfifo制作fifo。如果您之前在单独的程序中执行了该操作,或者该文件已经存在,请尝试,但如果您没有这样做,您将无法获得任何结果。
对于2,当您在服务器上阅读文件已被写入时,没有任何担心。如果客户端首先运行,那么您需要刷新写入调用以确保首先写入fifo。这可以使用fsync()完成。一旦你对该文件描述符进行fsync(),就会写入该文件,你可以确保服务器可以读取这些值。通过让服务器读取fifo然后输出它读取的内容来验证这一点。