を要求します私の質問はサーバーと関連しているだけなので、クライアントを無視しています。コミュニケーションは正常に動作しています。クライアントからリクエストを読み取ることができ、私はそれらに答えることができます。今、私はいつでも、キー 'Q'が押されたときにサーバーを終了したいと言うことができます。read
ステートメントでコードブロックが別のクライアント要求を待っているので、私はこれを行うことはできません。 stdin
を読む方法はありません。C FIFOのクライアントを待っている間に、サーバの標準入力を読み取る方法は、私は、このサーバーのコードを持っているC.</p>でパイプ <p>という名前のLinuxを使用して簡単なIPCシステムを実装しています
これは何かできますか?私はread
ステートメントをノンブロッキングのように考えていて、stdin
を数秒間読んでから、もう一度受信リクエストをチェックしてみてください。私は検索していますが、何も似たものは見つかりませんでした。
UPDATE:
私はジャン=バティストYunèsのアプローチを踏襲したが、それはselect
だけFIFOのイベントを検出して、私は本当に理由を知らないことが判明。
この
は私がテストだコードです:#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int result, fd, maxDescriptor;
char input[20], texto[100];
mknod("fifo", S_IFIFO | 0666, 0);
fd = open("fifo", O_RDWR); // RDWR to avoid EOF return to select
fd_set readset;
FD_ZERO(&readset);
FD_SET(fileno(stdin), &readset);
FD_SET(fd, &readset);
maxDescriptor = fileno(stdin) > fd ? fileno(stdin) : fd;
while(1)
{
result = select(maxDescriptor+1, &readset, NULL, NULL, NULL);
if(result == -1)
perror("select()");
else if(result)
{
puts("data available.");
if(FD_ISSET(fileno(stdin), &readset))
{
scanf("%s", input);
printf("%s\n", input);
if(strcmp(input, "Q") == 0)
break;
}
if(FD_ISSET(fd, &readset))
{
read(fd, texto, 100);
printf("lido:\n%s\n", texto);
}
}
else
puts("no data.");
}
unlink("fifo");
return 0;
}
UPDATE 2:
ジャン=バティスト・Yunèsが指摘したように、それは自動的にリセットされませんので、FD_SETをリセットする必要があります。ここで
は、最終的な作業コードです:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int result, fd, maxDescriptor;
char input[20], texto[100];
mknod("fifo", S_IFIFO | 0666, 0);
fd = open("fifo", O_RDWR); // RDWR to avoid EOF return to select
fd_set readset;
FD_ZERO(&readset);
FD_SET(fileno(stdin), &readset);
FD_SET(fd, &readset);
maxDescriptor = fileno(stdin) > fd ? fileno(stdin) : fd;
while(1)
{
result = select(maxDescriptor+1, &readset, NULL, NULL, NULL);
if(result == -1)
perror("select()");
else if(result)
{
puts("data available.");
if(FD_ISSET(fileno(stdin), &readset))
{
scanf("%s", input);
printf("%s\n", input);
if(strcmp(input, "Q") == 0)
break;
}
if(FD_ISSET(fd, &readset))
{
read(fd, texto, 100);
printf("lido:\n%s\n", texto);
}
FD_SET(fileno(stdin), &readset);
FD_SET(fd, &readset);
}
else
puts("no data.");
}
unlink("fifo");
return 0;
}
選択やpollあなたはまた、非同期I/Oを使用してコードを書くことを検討することができます(検索選択) –
あなたが複数のファイル記述子で待ってブロックし、それらのいずれかが読み取りの準備ができているか、書き込み時にブロック解除できるようになります。 "libevent"は、非同期コードの作成を簡素化する素敵なCライブラリです。 –
サーバは主にサービスを無期限に実行し、stdinからの入力を読み取っていません。それらはコミュニケーションチャネルを読み、スクリプトから開始されるか停止される(殺される)。 – kjohri