5

それとも、何らかのプロセスまたは何かが仮想端末をブロックする可能性はありますか? または、VT1 にアクセスしようとしたときにアプリケーションがハングする理由は何でしょうか?

それが起こっている間、関数にぶら下がっているようioctlです。特に、これは失敗するコードです:

int vtno = 1;
const char* vtname = "/dev/tty1";

int fd = open(vtname, O_RDWR|O_NDELAY, 0);

if (ioctl(fd, VT_ACTIVATE, vtno) < 0)
  printf("VT_ACTIVATE failed: %s\n", strerror(errno));

if (ioctl(fd, VT_WAITACTIVE, vtno) < 0)
  printf("VT_WAITACTIVE failed: %s\n", strerror(errno));

2 番目にハングしますioctl。中断すると、次のメッセージが表示されます。

VT_WAITACTIVE failed: Interrupted system call

また、そこで待機している間に、chvt 1別の端末から a を実行すると、それもハングします。

4

1 に答える 1

5

私は問題を発見しました。Linus Torvalds は、最初に同様の状況でそれを説明しました。これは実際には競合状態です。

問題は次のとおりです: 最初ioctl(fd, VT_ACTIVE, 1)のプロセスが成功した直後、つまりシステムが最初の VT に切り替わった直後に、別の別のプロセスが別の VT に切り替わった場合、2 番目のプロセスioctlは失敗します (または、永久に待機する、つまりハングします)。 VT1 に切り替えますが、これ以上は行いません (ユーザーがそうしない限り)。


まあ、それはそれを一部に説明しています。chvt 1がぶら下がっている理由も説明していません。

于 2010-09-02T18:28:50.327 に答える