EOFを送信できない場合は、「ノンブロッキングネコ」を使用できます。私はhereが見つかった(テスト済み)Cバージョンを含んでいます(クレジットは当然元の著者になります)。魔法はありますfcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK).
この非ブロッキング猫の最初の引数は、もう一度終了するまで待つ秒数です。
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
void read_loop(int fFile, double wWait)
{
if (fFile < 0) return;
double max_time = wWait, total_time = 0;
struct timespec cycle_time = { 0, 50 * 1000 * 1000 };
double add_time = (double) cycle_time.tv_sec + (double) cycle_time.tv_nsec/1000000000.;
char next_line[1024];
FILE *input_file = fdopen(fFile, "r");
while (total_time < max_time)
{
while (fgets(next_line, 1024, input_file))
{
write(STDOUT_FILENO, next_line, strlen(next_line));
total_time = 0;
}
nanosleep(&cycle_time, NULL);
total_time += add_time;
}
fclose(input_file);
}
int main(int argc, char *argv[])
{
if (argc < 2)
{
fprintf(stderr, "%s [max time] (files...)\n", argv[0]);
return 1;
}
int max_wait = strtoul(argv[1],0, 10);
if (argc == 2)
{
fprintf(stderr, "%s: using standard input\n", argv[0]);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
read_loop(STDIN_FILENO, max_wait);
return 0;
}
int current = 2;
while (current < argc)
{
fprintf(stderr, "%s: switch to file '%s'\n", argv[0], argv[current]);
int next_file = open(argv[current++], O_RDONLY | O_NONBLOCK);
read_loop(next_file, max_wait);
close(next_file);
}
return 0;
}
私はこの程度に来るとは思わなかった。私はそこにLinuxコマンドが組み込まれていることを期待していました。とにかく、私はすでにこの "吹き飛ばない猫"を使用しています。私はそれを少し変えました。私は浮動小数点演算を気に入らなかったので整数整数演算に変更し、時間引数をミリ秒受け入れに変更しました。ありがとう。 – GetFree