2012-05-12 7 views
0

をinifniteにつながる最初のものである:は、名前付きパイプを読むと、私はここでは、名前付きパイプを使用する2つの簡単なプログラムを持っているループ

int main(int argc,char **argv) 
{ 
    if (argc<2) 
    error_nsys_f("usage: [fifo]"); 

    if (mkfifo(argv[1],S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)<0) 
    error_sys_f("error while creating named pipe"); 

    int fd=open(argv[1],O_RDONLY); 
    int log_file=open("wyniki.log",O_WRONLY | O_CREAT| O_TRUNC,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); 
    long result; 
    size_t len; 
    if (fd<0) 
    error_sys_f("error while openning pipe"); 
    if (log_file<0) 
    error_sys_f("error while openning log file"); 
    //unlink(argv[1]); 
    char path[MAXLINE]; 
    char buffer[BUF]; 
    while(1) 
    { 
    if (read(fd,&len,sizeof(size_t)) == -1) 
    { 
     cleanup(fd,argv[1]); 
     error_sys_f("error while reading from file-name queue"); 
    } 
    if (read(fd,path,len) == -1) 
    { 
     cleanup(fd,argv[1]); 
     error_sys_f("error while reading from file-name queue"); 
    } 
    result=count(path,buffer); 
    if (result>-1) 
    { 
     sprintf(buffer,"%s: %ld\n",path,result); 
     if (write(log_file,buffer,strlen(buffer)) == -1) 
     { 
     cleanup(fd,argv[1]); 
     error_sys_f("error while writing to log-file"); 
     } 
    } 
    } 
} 

と私は彼を与える、第2のプログラムに2番目の

int main(int argc,char **argv) 
{ 

if (argc<3) 
    error_nsys_f("usage: [fifo] [plik1] [plik2]...\n"); 

int fd=open(argv[1],O_WRONLY); 
int i; 
int s; 
if (fd<1) 
    error_sys_f("nie udalo sie otrzymac dostepu do kolejki"); 

for(i=2;i<argc;++i) 
{ 
    s=strlen(argv[i])+1; 
    if (write(fd,&s,sizeof(size_t)) == -1) 
    { 
     close(fd); 
     error_sys_f("error while writing to queue"); 
    } 
    if (write(fd,argv[i],strlen(argv[i])+1) == -1) 
    { 
     close(fd); 
     error_sys_f("error while writing to queue"); 
    } 
} 
close(fd); 
return EXIT_SUCCESS; 
} 

書き込むFIFOの名前とファイルの名前、最初の名前とファイル名の長さを読み取り、バイト数をカウントしてログファイルに書き込みます。

しかし、たとえばfifoに1つのファイル名を書き込もうとすると、最初のプログラムは名前と長さを読み取り、カウントを実行しますが、その後はすべて同じファイル名を読み取りますfifoからの時間。彼はfifoから読み込まれたメッセージを削除しなかったように振舞う。これの原因は何ですか?

+1

を真剣に、どのようにされた「というエラーが開いているときに、パイプ」有用なエラーメッセージを

は、だからあなたのコードは、read()は同様に0を返した場合、ループを停止する必要がありますか?エラーメッセージにパスを入れてください!! "エラーオープニング/ foo/bar:ディレクトリではありません"が役に立ちます。 "エラーオープニングパイプ:ディレクトリではありません"というのは悪化しているだけです。 –

+0

良い点、私はこれは私の個人的な使用のためだけであるため、これは考えていませんでした。 – Andna

答えて

3

read()が0を返すケースは処理されません。これは、データがなくなり、もう一方のパイプがパイプを閉じたことを意味します。それを返すときだけでなく-1

関連する問題