こんにちは。加藤です。 前回の続きです。 On Sat, 1 Sep 2012 01:09:17 +0900 "N.Katoh" <typer...@yahoo.co.jp> wrote: > 想像通り、moused が走っているのに 初回では MousedRunning が FALSE を返すようです。 > popen はあまり使ったことないので良く分かりませんが、エラーが起きているのかもしれません。
ということで、src/bsd_mouse.c の MousedRunning関数を調べてみました。 MousedRunning関数は moused(8)が走っているかを調べています。 方法は fstat(1)または pgrep(1)を popen(3)を使って実行し、 その結果を fscanf(3)で読むのですが、その際 read(2)で EINTR が発生する様です。 と原因は分かったものの対処は「fscanf(3)を繰り返す」で良いのでしたっけ? 以下、確認用パッチ --- src/bsd_mouse.c.org 2012-09-01 17:01:11.612257386 +0900 +++ src/bsd_mouse.c 2012-09-01 17:03:15.000000000 +0900 @@ -302,13 +302,21 @@ char cmd[128]; FILE *f = NULL; unsigned int i; + char buff[256]; + char *ret; if (dev) sprintf(cmd, "sh -c 'fstat %s | grep -c moused' 2>/dev/null", dev); else sprintf(cmd, "sh -c 'pgrep -nx moused' 2>/dev/null"); if ((f = popen(cmd, "r")) != NULL) { - if (fscanf(f, "%u", &i) == 1 && i > 0) { + ret = fgets(buff, 256, f); + if (ret == NULL) { + if (ferror(f)) { + xf86Msg(X_WARNING, "MousedRunning(\"%s\"), fgets error: %s\n", + dev, strerror(errno)); + } + } else if (sscanf(ret, "%u", &i) == 1 && i > 0) { pclose(f); return TRUE; } 結果(/var/log/Xorg.0.log) (WW) USB Mouse: No Device specified, looking for one... (WW) MousedRunning("(null)"), fgets error: Interrupted system call (WW) MousedRunning("/dev/ums0"), fgets error: Interrupted system call (II) USB Mouse: Setting Device option to "/dev/ums0" (--) USB Mouse: Device: "/dev/ums0" 以下略