1
何らかの理由で、tcsetattrを引数として持つプログラムをbashスクリプトから与えると、tcsetattrがハングします。ターミナルでbashスクリプトの外で直接呼び出しても、ハッシュは発生しません。なぜこれが起こるのですか? https://github.com/coreutils/coreutils/blob/master/src/timeout.cを見ると、どのファイル記述子でもタイムアウトのようには思えません。 2つの信号を無視するように設定されているようですが、ここでは関係ありません。なぜbashスクリプトからタイムアウトプログラムを呼び出すと、tcsetattrがハングするのですか?
次の最小テストケースである:
short.c
#include <stdio.h>
#include <termios.h>
#include <string.h>
int main() {
struct termios tty;
tcgetattr(0, &tty);
fprintf(stderr, "Before tcsetattr");
tcsetattr(0, TCSANOW, &tty);
fprintf(stderr, "After tcsetattr");
}
simple_check.sh
#!/bin/bash
timeout 5 ./a.out < /dev/tty
echo $?
バッシュ出力
$ gcc short.c
$ bash simple_check.sh
Before tcsetattr
124 # Note this should output `After tcsetattr` if it was 'working'
$ timeout 5 ./a.out < /dev/tty
Before tcsetattr
After tcsetattr
潜在的に有用な情報
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial
私のUbuntu 12.04システムで問題なく動作します。 – codeforester
'bash simple_check.sh'のように出力する前にtcsetattr tcsetattrの後に? @codeforester – kshikama
それはハングアップしません!混乱させて申し訳ありません。 – codeforester