トップページ > プログラム > 2015年02月04日 > 2A4M88bu

書き込み順位&時間帯一覧

32 位/196 ID中時間01234567891011121314151617181920212223Total
書き込み数0000200000000000000000002



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
711
UNIXプログラミング質問すれ Part10

書き込みレス一覧

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のバグでしょうか?


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。