- UNIXプログラミング質問すれ Part10
711 :デフォルトの名無しさん[sage]:2015/02/04(水) 04:25:26.78 ID:2A4M88bu - MacOS X 10.8.5でpollがうまく動作せず、困っています。
lessなどのpagerで、標準入力をpipeからttyに切り替えるために、 /dev/ttyをstdinにdupする処理をしていますが、Macではその後の stdinに対する有限時間のpollがタイムアウトしなくなります。 サンプルコードはこんな感じです。 #include <fcntl.h> #include <poll.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main() { char *ttyold, *ttynew; int fd; struct pollfd pfd[1]; ttyold = strdup(ttyname(STDIN_FILENO)); fd = open("/dev/tty", O_RDONLY); dup2(fd, STDIN_FILENO); close(fd); ttynew = strdup(ttyname(STDIN_FILENO)); printf("old:%s, new:%s\n", ttyold, ttynew); pfd[0].fd = STDIN_FILENO; pfd[0].events = POLLIN; if (poll(pfd, 1, 1000) == 0) printf("timeout\n"); return 0; }
| - UNIXプログラミング質問すれ Part10
712 :711[sage]:2015/02/04(水) 04:26:55.16 ID:2A4M88bu - (承前)
NetBSD, FreeBSD, Linux, Solarisでは1秒間でタイムアウトします。 BSDとLinuxでは/dev/ttyをオープンすると、実際に使用中のttyを 開きますが、MacとSolarisは/dev/ttyそのものがopenされるようです。 Mac上で/dev/ttyではなく、元のttyデバイスを明示的にopenして stdinにdupすると、pollはタイムアウトするようになります。 これはOS Xのバグでしょうか?
|
|