2017-01-31 3 views
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 
+0

私のUbuntu 12.04システムで問題なく動作します。 – codeforester

+0

'bash simple_check.sh'のように出力する前にtcsetattr tcsetattrの後に? @codeforester – kshikama

+0

それはハングアップしません!混乱させて申し訳ありません。 – codeforester

答えて

1

--foregroundオプションを使用すると、この問題を回避できますか? これは、タイムアウト(および子)を自分のプログラムグループに入れるのを止めます。

関連する問題