From: Naohisa Goto Date: 2011-10-24T16:56:03+09:00 Subject: [ruby-dev:44688] [ruby-trunk - Bug #5475][Open] r33507以降SolarisでPTYが使えない Issue #5475 has been reported by Naohisa Goto. ---------------------------------------- Bug #5475: r33507以降SolarisでPTYが使えない http://redmine.ruby-lang.org/issues/5475 Author: Naohisa Goto Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 2.0.0dev (2011-10-24) [sparc-solaris2.10] r33507以降、SolarisでPTYがまともに使えません。 % ruby -rpty -e 'PTY.spawn("/bin/cat") { |r,w,id| p r; p w; p id }' を実行すると、 -e:1:in `spawn': can't get Master/Slave device (RuntimeError) from -e:1:in `
' のようになります。 make test-all では、TestIO_ConsoleはほとんどのテストがSkipされてしまいます。 TestPTYも同様に多数のSkipおよび以下のErrorが出ます。一部を抜粋します。 36) Skipped: test_echo(TestIO_Console) [/XXX/test/io/console/test_io_console.rb:171]: can't get Master/Slave device (中略) 46) Skipped: test_winsize(TestIO_Console) [/XXX/test/io/console/test_io_console.rb:171]: can't get Master/Slave device 47) Skipped: test_argv0(TestPTY) [/XXX/test/test_pty.rb:49]: can't get Master/Slave device (中略) 80) Error: test_pty_check_default(TestPTY): RuntimeError: can't get Master/Slave device /XXX/test/test_pty.rb:170:in `spawn' /XXX/test/test_pty.rb:170:in `test_pty_check_default' (以下略) デバッガで追ってみると、ext/pty/pty.c:296 の grantpt(masterfd) が -1 となり、 errno は EACCES (Solaris10では13) でした。 そして、r33507で新規に導入された ext/pty/pty.c:294 の rb_fd_set_cloexec(masterfd); で masterfd に FD_CLOEXEC フラグを設定しているのが原因のようです。 Solarisでは、grantpt(3) 内部で /usr/lib/pt_chmod という setuid root されたヘルパープログラムを呼んでデバイスファイルのパーミッション設定を行っていますが、FD_CLOEXECをptyのmasterfdに設定すると、ヘルパープログラムを呼ぶ際に自動でcloseされてしまうため、ヘルパープログラムにclose済みのファイルデスクリプタが渡され、エラーになるのだろうと推測します。 -- http://redmine.ruby-lang.org