serial-non-block

来自「xen 3.2.2 源码」· 代码 · 共 49 行

TXT
49
字号
Index: ioemu/vl.c===================================================================--- ioemu.orig/vl.c	2007-05-03 19:15:06.000000000 +0100+++ ioemu/vl.c	2007-05-03 19:15:58.000000000 +0100@@ -1298,19 +1298,34 @@  static int unix_write(int fd, const uint8_t *buf, int len1) {-    int ret, len;+    int ret, sel_ret, len;+    int max_fd;+    fd_set writefds;+    struct timeval timeout;++    max_fd = fd;      len = len1;     while (len > 0) {-        ret = write(fd, buf, len);-        if (ret < 0) {-            if (errno != EINTR && errno != EAGAIN)-                return -1;-        } else if (ret == 0) {-            break;+        FD_ZERO(&writefds);+        FD_SET(fd, &writefds);+        timeout.tv_sec = 0;+        timeout.tv_usec = 0;+        sel_ret = select(max_fd + 1, NULL, &writefds, 0, &timeout);+        if (sel_ret <= 0) {+            /* Timeout or select error */+            return -1;         } else {-            buf += ret;-            len -= ret;+            ret = write(fd, buf, len);+            if (ret < 0) {+                if (errno != EINTR && errno != EAGAIN)+                    return -1;+            } else if (ret == 0) {+                break;+            } else {+                buf += ret;+                len -= ret;+            }         }     }     return len1 - len;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?