gpt4 book ai didi

c - 试图弄清楚pty

转载 作者:太空宇宙 更新时间:2023-11-04 10:44:08 26 4
gpt4 key购买 nike

我一直在尝试创建一个伪终端来与 mpg123 通信。从我所有的阅读资料来看,我相信我已经正确地编写了代码,但我无法弄清楚我应该如何将主端 (PTY) 与外部程序连接起来。

我使用 posix_openpt 获得第一个可用的主机,并使用 grantptunlockpt 启用从机。然后我使用 ptsname 获取 PTS 名称,它可以与 open 一起使用以获取文件描述符。接下来,我将 PTY 的 STDIN、STDOUT 和 STDERR 替换为 dup2。然后我可以使用该文件描述符与 PTY 通信。但是master端如何连接到我想与之通信的外部程序呢?

到目前为止,这是我的代码:

#define _XOPEN_SOURCE 600
#include <stdio.h>
#include <libgen.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <termios.h>
#include <sys/wait.h>

int main (int argc, char *argv[])
{
int fdm;
int fds;
pid_t pid;
char *slave_name;
char *program_name;

program_name = basename(argv[0]);

if(argc != 1)
{
fprintf(stderr, "usage: %s\n", program_name);
exit(EXIT_FAILURE);
}

if((fdm = posix_openpt(O_RDWR)) == -1)
{
fprintf(stderr, "%s: posix_openpt failed (%s)\n", program_name, strerror(errno));
exit(EXIT_FAILURE);
}

if(grantpt(fdm) == -1)
{
fprintf(stderr, "%s: grantpt failed (%s)\n", program_name, strerror(errno));
close(fdm);
exit(EXIT_FAILURE);
}

if(unlockpt(fdm) == -1)
{
fprintf(stderr, "%s: unlockpt failed (%s)\n", program_name, strerror(errno));
close(fdm);
exit(EXIT_FAILURE);
}

if((slave_name = ptsname(fdm)) == NULL)
{
fprintf(stderr, "%s: ptsname failed\n", program_name);
close(fdm);
exit(EXIT_FAILURE);
}

if((pid = fork()) == -1)
{
fprintf(stderr, "%s: fork failed (%s)\n", program_name, strerror(errno));
close(fdm);
exit(EXIT_FAILURE);
}

if(pid == 0) // Child
{
if(setsid() == -1)
{
fprintf(stderr, "%s: setsid failed (%s)\n", program_name, strerror(errno));
close(fdm);
exit(EXIT_FAILURE);
}

if((fds = open(slave_name, O_RDWR)) == -1)
{
fprintf(stderr, "%s: open failed (%s)\n", program_name, strerror(errno));
close(fdm);
exit(EXIT_FAILURE);
}

close(fdm);

if(dup2(fds, STDIN_FILENO) == -1)
{
fprintf(stderr, "%s: dup2(1) failed (%s)\n", program_name, strerror(errno));
close(fds);
exit(EXIT_FAILURE);
}

if(dup2(fds, STDOUT_FILENO) == -1)
{
fprintf(stderr, "%s: dup2(2) failed (%s)\n", program_name, strerror(errno));
close(fds);
exit(EXIT_FAILURE);
}

if(dup2(fds, STDERR_FILENO) == -1)
{
fprintf(stderr, "%s: dup2(3) failed (%s)\n", program_name, strerror(errno));
close(fds);
exit(EXIT_FAILURE);
}

close(fds);
exit(EXIT_SUCCESS);
}
else // Parent
{
wait(&pid);
}

exit(EXIT_SUCCESS);
}

我不是要施舍,只是要解释。如何连接到 mpg123?我在哪里连接到 mpg123,在 child 还是 parent ?

最佳答案

通常您会在子进程中调用 execvp 来执行 mpg123。然后,您通过充当终端用户的主文件描述符 (fdm) 进行通信(TTY 是为人类用户准备的)。

您确定需要为此使用 pty 吗?大多数程序仅使用标准输入/标准输出的普通管道即可正常工作。您可以通过在父进程中调用 pipesockerpair 创建它们。更好的是,如果您只需要读取或只需要写入,您可以使用 popen 来大大简化界面。

关于c - 试图弄清楚pty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33848271/

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