2

最近、私は私たちのグループが非常に定期的に使用するアプリケーションの1つをカスタマイズすることを任されました。アプリケーションはCで書かれていますが、これは私があまり経験したことのないものです。私がやろうとしていることの機能的な例をいくつか見つけましたが、現時点ではテストベッドに完全に統合できていません。

要件は非常に単純です。名前付きパイプを開き、データをプッシュして、別のグループがパイプを読み取ってそれを使って何かを実行できるようにします。これは、サーバーがその処理を中断しないようにする必要があります。

私のアプリケーションには、履歴と呼ばれる配列があり、必要なすべての値が含まれています。私はこれまで、これを達成しようとした試みとさまざまな結果を出してきました。以下のコードスニペットをご覧ください。

DCmass_add_history(history, history_num);

int fd;
char * myfifo = "/tmp/fooPipe";

/* create the FIFO (named pipe) */
mkfifo(myfifo, 0666);

/* open FIFO (named pipe) */
fd = open(myfifo, O_WRONLY);
  for (i = 0; i < history_num; i++) {

  /* Write our data to our FIFO (named pipe) */
  fprintf(fd, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns);

}
close(fd);

write以前は、の代わりにを使用したときにある程度の成功を収めましたfprintfが、パイプに変数を取得できませんでした。

前のスタックオーバーフローの例、スタックオーバーフローの例から、パイプをテストするための基本的なリーダーと、パイプを開くための上記の基本的なコードを取得することができました。

4

4 に答える 4

3

回線上で受信している警告はfprintf()ヒントになるはずです。

を使用する場合は、ではなく、を使用しfprintf()てを開く必要があります。FILE *fopen()open()

FILE *fd = fopen(myfifo, "w");

を使用して閉じfclose()ます。

于 2013-03-08T00:45:56.867 に答える
0

バッファリングを厳密に制御する必要があります。setlinebuf()が役立つと思いますが、私は常にsnprintf()を使用して変数をバッファーにフォーマットし、完全に自分の制御下にあるwrite()を使用するのが好きです。一度に行全体。

printf()で発生する可能性があるのは、より大きなバッファです。setlinebuf()なしで十分な行が蓄積されると、行の一部のみがフォーマットされます。アトミック書き込みを保証するのに十分小さいバッファーでwrite()を明示的に使用することにより(ローカルOSで制限を確認してください)、行が分割されないことを保証できます。

読者は、FIFOを読むときに、\ nまで読み続けるためにそのような分割行に気付くように非常に注意する必要がありますが、ここでは全員が適切に注意しているため、これが問題になる可能性があります。

于 2013-03-08T00:50:42.447 に答える
0

FifoFileを使用する場合は、このように書くことができます

char * mesg;
// allocating for mesg; and then 

sprintf(msg, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns);

write(fd, msg, sizeof(msg));

お役に立てば幸いです。

于 2014-04-08T08:00:15.623 に答える
0

これはあなたが望むことを与えません

int fd;

ファイルミッション用

FILE *fd = fopen(fileName , option);

temp.txt、database.txtなどのファイル名

オプション-r(読み取り可能)

-w(書き込み可能)

-r+およびw+(最後の行のテキストを追加して書き込みおよび読み取り)

于 2015-04-07T21:54:57.650 に答える