こんにちは。加藤です。
前回の続きです。

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"
以下略

メールによる返信