gpt4 book ai didi

c++ - Linux 中伪终端的读写问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:14 32 4
gpt4 key购买 nike

我正在编写一个与外部进程交互的 C++ 程序。外部进程用 C# 编写并在单声道上运行。请注意,我无法修改 C# 代码,因为它不是我编写的程序。

在这方面,我首先开始使用管道,当然后来我意识到它是完全缓冲的,因此我遇到了很多同步问题。本质上,外部进程必须在每次写入后刷新其输出,这是不可能的。

接下来我要尝试的是文件,但我发现使用伪终端更适合我的情况。这是我编写的一些示例代码:

int main()
{
int fdm, fds, rc, pid;
bool rValue;
/* Setup Master pty*/
rValue = rValue && (fdm = posix_openpt(O_RDWR)) >= 0 &&
(rc = grantpt(fdm)) == 0 && (rc = unlockpt(fdm) == 0);
if (rValue) {
/* Open Slave pty */
fds = open(ptsname(fdm), O_RDWR);
pid = fork();
if(pid < 0)
perror("fork failed");
else if(pid == 0) //child
{
close(fdm); //close master
struct termios slave_orig_term_settings;
struct termios new_term_settings;
tcgetattr(slaveTTY, &slave_orig_term_settings);
new_term_settings = slave_orig_term_settings;
cfmakeraw(&new_term_settings);
tcsetattr(slaveTTY, TCSANOW, &new_term_settings);

//redirect I/O of this process
close(0);
close(1);
close(2);
dup(slaveTTY);
dup(slaveTTY);
dup(slaveTTY);

close(slaveTTY);

setsid();
ioctl(0, TIOCSCTTY, 1);

//launch the external process and replace its image in this process
execve(argv[0],...);
}
else
{
close(fds); //close slave
//Perform some interaction
write(something using fdm);
//Assume fdsets declared and set somewhere here
select(fdm +1,&fdset,NULL,NULL,NULL);
int readBytes = read(someting using fds);
}
}
return EXIT_SUCCESS;
}

假设正在处理 select 的 fdset 和 fdclr。

在父进程中观察到以下问题:

  1. 有时 read 返回 readBytes > 0 但缓冲区中没有任何内容
  2. 有时会读回已写入终端的内容
  3. 一些垃圾值,如 ^]]49]1R 被转储到终端(这是实际的终端,即我的输出窗口)

P.S:外部进程用C/C++写的时候,不会出现这个问题。仅当我在单声道中运行 C# 程序时。

最佳答案

我认为pexpect如果您不必在 C++ 中执行此操作,那么在 python 中是一个不错的选择,它将为您节省大量时间。您还可以使用 python 卡住工具,如 pyinstaller将您的 Python 脚本转换为独立的二进制文件。

关于c++ - Linux 中伪终端的读写问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13081297/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com