I have experienced a minor difficulty using QEMU with the "-serial pty" option:
If a process opens the slave pts device, writes data to it, then immediately closes it, the data doesn't reliably get delivered to the emulated serial port. This seems to be because a read of the master pty device returns EIO on Linux if no process has the pts device open, even when data is waiting "in the pipe". A fix seems to be for QEMU to keep the pts file descriptor open until the pty is closed, as per the below patch. --- qemu-char.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qemu-char.c b/qemu-char.c index 2969c44..ed03ba0 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -1198,6 +1198,7 @@ typedef struct { int connected; guint timer_tag; guint open_tag; + int slave_fd; } PtyCharDriver; static void pty_chr_update_read_handler_locked(CharDriverState *chr); @@ -1373,6 +1374,7 @@ static void pty_chr_close(struct CharDriverState *chr) qemu_mutex_lock(&chr->chr_write_lock); pty_chr_state(chr, 0); + close(s->slave_fd); fd = g_io_channel_unix_get_fd(s->fd); g_io_channel_unref(s->fd); close(fd); @@ -1401,7 +1403,6 @@ static CharDriverState *qemu_chr_open_pty(const char *id, return NULL; } - close(slave_fd); qemu_set_nonblock(master_fd); chr = qemu_chr_alloc(); @@ -1422,6 +1423,7 @@ static CharDriverState *qemu_chr_open_pty(const char *id, chr->explicit_be_open = true; s->fd = io_channel_from_fd(master_fd); + s->slave_fd = slave_fd; s->timer_tag = 0; return chr; -- 2.1.4 --- Jonathan Ashley jonathan.ashley AT altran.com