子进程无法从创建的伪终端读取

时间:2010-02-02 18:45:45

标签: c posix pty

我正在尝试使用伪终端编写一个可以使用密码登录SSH的应用程序。但是如果我写()到主设备,那么数据不会出现在从设备中。这是一个简单的测试用例:

#include <sys/wait.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#ifdef __linux__
    #include <pty.h>
#else
    #include <util.h>
#endif

int
main() {
    int master;
    pid_t pid = forkpty(&master, NULL, NULL, NULL);
    if (pid == 0) {
        int ch;
        read(0, &ch, 1);
        _exit(1);
    } else {
        printf("Press Enter to send a byte.\n");
        getchar();
        write(master, "1", 1);
        printf("Done. Waiting for process to exit...\n");
        waitpid(pid, NULL, 0);
        return 0;
    }
}

应用程序将首先输出“按Enter键发送一个字节”。按Enter后,我希望子进程的read()返回。但是read()似乎无限期地阻塞,即使master的write()成功,所以master在waitpid()上永远等待。发生了什么事?

2 个答案:

答案 0 :(得分:2)

问题是你没有修改PTY的线路规则。默认的线路规则是面向行的,因此在读取换行符之前,不会向从属进程发送任何输入。 (您可以通过向从站发送“\ n”而不是“1”来查看此内容。)您可以在子进程中通过调用tcgetattr,{{1}在RAW模式下运行PTY和cfmakeraw,如下所示:

tcsetattr

这似乎对我有用。

答案 1 :(得分:1)

this blog post的示例代码可能应该有所帮助。作者对原始问题进行了更新(与您的问题非常相似),并给出了可用的spawn (char *argv[]);函数。