情報の追加です. In message <200102261501.AAA65197 / mail3.os.xaxon.ne.jp> kjana / os.xaxon.ne.jp writes: > Solaris 2.5.1 上で pty に対して Termios.{getattr,setattr} すると ioctl > でくじけてしまいます.たとえば > > require "pty" > require "termios" > > PTY.spawn("sh") {|co, ci, pid| p Termios.getattr(ci)} > > なんていうのができません.正確なエラーメッセージはちょっともってくるの > 忘れましたが,ioctl が引数エラーになるようでした. ただ configure && make した場合の pty モジュールでは ENOTTY. # つまりマスター側は tty じゃないといわれてる. > 「pty ライブラリの /dev/ptmx がある場合,っていうコードはデフォルトだ > と cygwin の場合しか使われない」っていうは関係無かったようです.... pty モジュールを -DHAVE_DEV_PTMX で作り直した場合だと EINVAL でした. # EINVAL The STREAM or multiplexer referenced by # fildes is linked (directly or indirectly) # downstream from a multiplexer. # ....ええと,結局何が悪いんだろう. slave 側に対してはちゃんと使えるんですけどね. # << C で後につけたよう手抜きプログラムを書いて動くよなあとかいいつつ, # 帰り道で master 側に対してやったわけではないことに気づいた間抜け. ....もしかして子プロセスが pty slave に何を設定したのかを親で検知しよ う,っていうのに親が pty master に tcgetattr するっていうのが間違い? POSIX 的にはどうするのが正解なんでしょうか.... -- 柳川和久 @ 東大阪市 . 大阪府 February 27, 2001 What can't be cured must be endured.
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <fcntl.h> #include <sys/stream.h> #include <sys/termios.h> #include <sys/types.h> #include <stropts.h> #include <sys/conf.h> int main(void) { char *sh = "/bin/sh"; char *pn; int fd, ptyfd; struct termios tios; if ((fd = open("/dev/ptmx", O_RDONLY, 0)) < 0) { perror("ptmx open"); exit(1); } signal(SIGCHLD, SIG_DFL); grantpt(fd); unlockpt(fd); if ((pn = ptsname(fd)) == 0) { perror("ptsname"); exit(1); } if ((ptyfd = open(pn, O_RDWR, 0)) < 0) { perror("pty open"); exit(1); } ioctl(ptyfd, I_PUSH, "ptem"); ioctl(ptyfd, I_PUSH, "ldterm"); if (tcgetattr(ptyfd, &tios) < 0) { perror("tcgetattr"); exit(1); } return 0; }