首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从pty中读取

从pty中读取
EN

Stack Overflow用户
提问于 2010-06-04 23:50:30
回答 1查看 2.2K关注 0票数 5

我希望在Linux上使用(unix98风格)伪tty接收(并在以后处理) write(1)wall(1)消息。我已经有了以下最小的实现:

代码语言:javascript
复制
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <utempter.h>

#define BUF_LENGTH 1024

int
main (void)
{
    FILE *lf;
    int masterfd, slavefd;
    char *slave_name = NULL;
    char buf[BUF_LENGTH];
    size_t nbytes = sizeof(buf);
    ssize_t bytes_read;
    int exit_code = EXIT_SUCESS;

    if ((masterfd = posix_openpt (O_RDWR | O_NOCTTY)) == -1 
            || grantpt (masterfd) == -1
            || unlockpt (masterfd) == -1
            || (slave_name = ptsname (masterfd)) == NULL)
        exit (EXIT_FAILURE);

    if (!(lf = fopen("term.log","w")))
        exit (EXIT_FAILURE);

    addToUtmp (slave_name, NULL, masterfd);

    for (;;)
    {
        bytes_read = read(masterfd, buf, nbytes);
        if (bytes_read <= 0)
            break
        fwrite (buf, 1, bytes_read, lf);
    }

    if (bytes_read < 0)
    {
        fprintf (stderr, "error reading from master pty: %s\n", strerror (errno));
        exit_code = EXIT_FAILURE;
    }

    fclose (lf);
    if (slavefd >= 0)
        close (slavefd);
    if (masterfd >= 0)
    {
        removeLineFromUtmp (slave_name, masterfd);
        close (masterfd);
    }
    exit (exit_code);
}

现在的问题是,它只在读取第一条消息时起作用,然后读取会给我一个EIO错误。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-05 00:41:59

看起来这只是在最后一个从文件描述符关闭时发生的。考虑到write(1)wall(1)将拥有到从机的唯一文件描述符,只要它们完成写入,您就会得到EIO。

防止这种情况发生的最简单方法是保留一个文件描述符。在ptsname调用之后,立即执行一个open(slave_name, O_RDRW)

(奇怪的是,您已经有了一个slavefd变量,以及清理它的代码。你在测试我们吗?:p)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2975733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档