2

次のような方法でUnixFIFOのペアを使用したいと思います。

  • クライアントはサーバーにファイル名を送信し、
  • サーバーはクライアントに戻ります:指定されたファイルからの単語数、行数、バイト数。

手伝ってもらえますか?

client.c

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

int main()
{
int nr,s2c,c2s,c,d,e;
char a[20];

c2s=open("fifo1",O_WRONLY);
s2c=open("fifo2",O_RDONLY);

printf("give file name \n");
scanf("%s",a);

nr=strlen(a);

write(c2s,&nr,sizeof(int));
write(c2s,&a,sizeof(nr));

read(s2c,&c,sizeof(int));   
read(s2c,&d,sizeof(int));
read(s2c,&e,sizeof(int));

close(c2s);
close(s2c);

return 0;
}

server.c

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

int main()
{
    int nr,s2c,c2s,c,d,e;
    char a[20];
    FILE* f;

    c2s=open("fifo1",O_RDONLY);
    s2c=open("fifo2",O_WRONLY);

    read(c2s,&nr,sizeof(int));
    read(c2s,&a,sizeof(nr));    

    f=fopen(a,"r");

    if(fork()==0) 
    {
        printf("result is: \n");
        execl("/usr/bin/wc","wc",c,d,e,NULL);
    }
    wait(0);

    write(s2c,&c,sizeof(int));
    write(s2c,&d,sizeof(int));
    write(s2c,&e,sizeof(int));

    close(c2s);
    close(s2c);

    printf("\n FINISH \n");

    return 0;
}

私はいくつかの改善を行いましたが、それでも正しく機能しません。

4

2 に答える 2

1

サーバーのfork'ed部分で、の標準入出力をリダイレクトしますwc

dup2(c2s, STDIN_FILENO);
dup2(s2c, STDOUT_FILENO);

次に、それを実行します

execl("/usr/bin/wc", "wc", NULL);

ファイル記述子を引数としてに渡さないでくださいexecl。。ではなく文字列(char const*)を想定していintます。

これがどのように機能するかを理解するdup2には、POSIX標準を参照してください。

于 2011-05-06T14:25:26.473 に答える
0

wc文字列を出力に書き込むことに注意してください。2進数のように読み込もうとしています。これは混乱を招きます-特に読み取り呼び出しが正しく機能したことを確認しないためです。

実際、一般的なコメント-システムコールをもっとチェックする必要があります。

また、FIFOを開くときにプロセスがブロックされないようにする必要があります。あなたは大丈夫なはずです。プロセスは、読み取りと書き込みのために「fifo1」を開き、次に「fifo2」を開きます。私はそれが物事に正しい順序を強制すると思います。

パイプに正しく書き込むのは4文字のファイル名のみです。

于 2011-05-11T15:56:38.373 に答える