gpt4 book ai didi

c - 从 pty 读取

转载 作者:太空狗 更新时间:2023-10-29 15:41:27 24 4
gpt4 key购买 nike

我想在 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 错误。这是为什么?

最佳答案

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

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

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

关于c - 从 pty 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2975733/

24 4 0
文章推荐: c - 向程序中添加一个函数,并从函数中的命令行调用该函数
文章推荐: javascript - css:拖动图像在 Firefox 中不起作用
文章推荐: Python、BeautifulSoup -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com