From: Kouichi Hirabayashi <k...@mogami.com>
Subject: [FreeBSD-users-jp 94053] Re: umodem で PICC18F2550 にアクセスすると不安定
Date: Thu, 15 Nov 2012 06:31:48 +0900

>> open()に O_NONBLOCK を与えないと、open()がブロッ
>> クされ、termios 関係の設定に進むことができなかったので、
>> O_NONBLOCK を追加しました。
> 
> /dev/ttyU0 でなく、/dev/cuaU0 を使うとどうなりますか?

あぁ、たしかに call out ですね。/dev/cuaU0 だと open()がブロックされな
くなりました。

read()から帰ってこなくなり、ttyin でブロックされています。

kohi@sh$ ps alxwwp 29573
  UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
    0 29573 29070   0  44  0  5832   968 ttyin  I+     0    0:00.00 ./test10

$ diff -u test8.c test10.c
--- test8.c     2012-11-13 20:31:49.000000000 +0900
+++ test10.c    2012-11-15 19:58:22.000000000 +0900
@@ -6,7 +6,6 @@
 #include <termios.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
-#include <sys/select.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/uio.h>
@@ -22,13 +21,11 @@
        ssize_t n;
        char    *tmesg,
                rmesg[16];
-       fd_set  fds;
        struct termios  tios;
-       struct timeval  timeout;
 
        for (i = 0; ; i++) {
                printf("i = %d\n", i);
-               if ( (fd = open("/dev/ttyU0", O_RDWR | O_NONBLOCK) ) < 0) {
+               if ( (fd = open("/dev/cuaU0", O_RDWR) ) < 0) {
                        err(1, "open()");
                }
                if (ioctl(fd, TIOCEXCL) < 0) {
@@ -53,33 +50,13 @@
                if (tcsetattr(fd, TCSADRAIN, &tios) < 0) {
                        err(1, "tcsetattr()");
                }
-               FD_ZERO(&fds);
-               FD_SET(fd, &fds);
-               timeout.tv_sec = 1;
-               timeout.tv_usec = 0;
                tmesg = "BARH\r\n";
                tlen = strlen(tmesg);
-               if ( (n = select(fd + 1, NULL, &fds, NULL, &timeout) ) < 0) {
-                       err(1, "select() for write()");
-               } else if (n == 0) {
-                       fprintf(stderr, "select() for write() timeout.\n");
-                       close(fd);
-                       sleep(PAUSE);
-                       exit(1);
-               }
                if (write(fd, tmesg, tlen) < 0) {
                        err(1, "write()");
                }
-               FD_ZERO(&fds);
-               FD_SET(fd, &fds);
-               if ( (n = select(fd + 1, &fds, NULL, NULL, &timeout) ) < 0) {
-                       err(1, "select() for read()");
-               } else if (n == 0) {
-                       fprintf(stderr, "select() for read() timeout.\n");
-                       close(fd);
-                       sleep(PAUSE);
-                       exit(1);
-               }
+               printf("back from write()\n");
+               sleep(PAUSE);   /* required... */
                bzero(rmesg, 16);
                if ( (n = read(fd, rmesg, 15) ) < 0) {
                        err(1, "read()");

---
kkdlabs.jp, featuring Koh-ichi Ito as just another DNS freak in town.

メールによる返信