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から読み込まれたメッセージを削除しなかったように振舞う。これの原因は何ですか?
を真剣に、どのようにされた「というエラーが開いているときに、パイプ」有用なエラーメッセージを
は、だからあなたのコードは、read()は同様に0を返した場合、ループを停止する必要がありますか?エラーメッセージにパスを入れてください!! "エラーオープニング/ foo/bar:ディレクトリではありません"が役に立ちます。 "エラーオープニングパイプ:ディレクトリではありません"というのは悪化しているだけです。 –
良い点、私はこれは私の個人的な使用のためだけであるため、これは考えていませんでした。 – Andna