0

彼ら!名前付きパイプまたは fifo を使用する最初のプログラムを作成しようとしています。クライアントはサーバーに正の整数を送信します。負の数が送信されると、送信は終了します。サーバーは、送信される最小数と最大数を決定し、2 つの値をクライアントに送り返します。私が抱えている問題は、印刷された最大値と最小値が常にゼロであり、問​​題の解決方法が本当にわからないことです。これは私がこれまでに持っているものです:

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);
}
4

1 に答える 1

2

これは非常に簡単な解決策です。

1の場合、mkfifoでfifoを作る必要があります。以前に別のプログラムでそれを行った場合、またはファイルが既に存在する場合はIDKですが、それがなければ何も取得できません。

2 の場合、ファイルが書き込まれたサーバー上で読み取りを行っている場合、保証はありません。クライアントが最初に実行される場合は、FIFO が最初に書き込まれたことを確認するために、書き込み呼び出しをフラッシュする必要があります。これは fsync() で行うことができます。そのファイル記述子で fsync() すると、ファイルが書き込まれ、サーバーが読み取る値がそこにあることを保証できます。これを確認するには、サーバーに fifo を読み取らせ、読み取った内容を出力させます。

于 2013-05-10T19:00:25.770 に答える