0

Bash スクリプト ファイル内でプログラムを実行すると、select() がタイムアウトしないという問題があります。これは私の実装です:

#include <sys/select.h>

bool checkKeyPressed()
{
  struct timeval tv;

  tv.tv_sec = 1;
  tv.tv_usec = 0;

  fd_set descriptor;
  const int input = 0;

  FD_ZERO(&descriptor);
  FD_SET(input, &descriptor);

  return select(1, &descriptor, NULL, NULL, &tv) > 0;
}

// プログラムを直接実行した後の strace 結果 (タイムアウトがあることを修正)

select(1, [0], NULL, NULL, {1, 0})      = 0 (Timeout)

// bash スクリプト ファイル内でアプリケーションを実行するための strace 結果 (タイムアウトなし)

select(1, [0], NULL, NULL, {1, 0})      = 1 (in [0], left {0, 999996})
read(0, "", 1)                          = 0

関数を変更して、Bash スクリプトでも実行できるようにするにはどうすればよいですか?

4

2 に答える 2

0

1秒のタイムアウトが必要な場合は、ファイル記述子をに渡さないでくださいselect()。この場合select()、ポータブルsleep()機能として機能します。

于 2013-02-12T13:36:27.543 に答える
0

トレース内の呼び出しをよく見るreadと、ファイルの終わりを意味するゼロが返されていることがわかります。

ファイル記述子が EOF にある場合 (またはリモート ソケットが閉じられている場合など)、記述子は読み取り可能であり、read0 が返されます。

CTRLインタラクティブ シェルで+を押しdても、同じ結果が得られます。

于 2013-02-12T09:19:50.743 に答える