次のコードを実行すると、その fd (標準入力) での将来のすべての read() 呼び出しが、入力をブロックする代わりにすぐに 0 を返す理由を知っている人はいますか?
termios newTerminalSettings;
tcgetattr(inFd, &newTerminalSettings);
newTerminalSettings.c_lflag &= ~ICANON;
tcsetattr(inFd, TCSANOW, &newTerminalSettings);
tcsetattr 行を削除すると、read() が期待どおりに動作するようになります。
また試しました:
fcntl(inFd, F_SETFL, 0);
運がない。
現在、2つの異なる端末があることに注意してください。それらのいずれかでアプリを実行すると、読み取りが即座に返されます。他の場所で実行すると、読み取りが入力のためにブロックされます。どうなり得るか?
前もって感謝します :-)
再現ソース:
#include <iostream>
#include <termios.h>
using namespace std;
int main(void) {
termios newTerminalSettings;
tcgetattr(0, &newTerminalSettings);
newTerminalSettings.c_lflag &= ~ICANON;
tcsetattr(0, TCSANOW, &newTerminalSettings);
char readBuf[5000];
cout << "read returned: " << read(0, readBuf, sizeof(readBuf));
return 0;
}