【问题标题】:Reading from a pty从 pty 读取
【发布时间】:2010-06-04 15:50:29
【问题描述】:

我想在 Linux 上使用(Unix 98 风格的)伪 tty 接收(以及后续处理)write(1) 和 wall(1) 消息。 我已经有以下最小实现:

#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 错误。这是为什么呢?

【问题讨论】:

    标签: c pty


    【解决方案1】:

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

    防止这种情况发生的最简单方法是保留文件描述符。在您拨打ptsname 之后,立即拨打open(slave_name, O_RDRW)。

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

    【讨论】:

    • D'oh,我一定是在试验时不小心删除了打开的行(因为您注意到 fd 变量和清理已经在那里)。非常感谢,另一双眼睛有时会很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2019-02-19
    • 2012-01-29
    相关资源
    最近更新 更多