我一直试图创建一个伪终端来与mpg123通信。从我所有的阅读资料来看,我相信我写的代码是正确的,但是我不知道我应该如何将主端(PTY)与外部程序连接起来。
我使用posix_openpt获得第一个可用的主节点,并使用grantptunlockpt启用从节点。然后我用ptsname得到PTS名称,可以用open得到一个文件描述符。接下来,我用dup2替换PTY的STDIN、STDOUT和STDERR。然后我可以使用这个文件描述符与PTY通信。但是主机端是如何连接到我想与之通信的外部程序的呢?
这是我目前的代码:

#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,在孩子或家长?

最佳答案

通常,您会在子进程中调用execvp来执行mpg123。然后通过主文件描述符(fdm)进行通信,主文件描述符充当终端的用户(tty是指人为用户)。
你确定你需要用pty来做这个吗?大多数程序只使用标准的stdin/stdout管道就可以正常工作。可以通过在父进程中调用pipesockerpair来创建。更好的是,如果您只需要读或只需要写,那么可以使用popen来简化界面。

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

10-12 16:05