4

我正在使用 C 中的 openpty 创建一个 pty,并在主/父和从/子之间共享它。孩子可以 fork/exec 并将文件描述符传递给其他程序。我想向孩子注入命令,但如果我立即传递它们,它们就会迷路。我如何从父进程中得知有人阻止了来自标准输入的输入?我碰巧在 SUSE 10 上工作,但我更喜欢发行版独立的解决方案。

编辑:这个问题的答案对我来说仍然很有趣,但可能与问题无关。我稍后再谈。

代码的简化版本是使用脚本源代码(可能需要修复一些标题),并添加行

char* command = "echo 'Hello World!'\r\n", written = 0;
(void)write(master, command, strlen(command));
(void)write(STDOUT_FILENO, "Sent command\r\n", 14);

在大之前

for (;;) {

主要。

我一直在从脚本执行 csh,但后来我注意到脚本命令正在转储一些垃圾(如在 vi 中所见)

^[[>0;115;0c

到父母的标准输入。如果我改为执行 bash shell,则不会丢弃任何内容,并且程序会很好地注入命令。

我仍然对所问问题的答案感到好奇,但显然它不再与我的问题相关,因为还有其他事情发生。如果有人确实知道如何查看是否正在阅读 pty,请随时回答。

4

2 回答 2

1

据我所知,文件描述符不会在前往另一个进程的过程中幸存下来。不过,您可以在线程之间共享它们。

至于知道什么时候有东西要读,我会尝试select在读取集中使用适当的文件描述符。

于 2012-07-31T11:23:42.657 回答
0

当我写信给 master fd 时,我注意到丢失东西的同样问题。

使用从 fd 进行写入可以避免问题。以及子标准输入的主 fd。这边走:

int main(void)
{
    int master_fd = -1;
    int slave_fd  = -1;

    if( openpty( &master_fd, &slave_fd, NULL, NULL, NULL ) != -1 )
    {
        const pid_t child_pid = fork();
        if( child_pid != -1 )
        {
            if( child_pid )
            {
                const char command[] = "command\n";
                close( master_fd );
                write( slave_fd, command, strlen(command) );
                close( slave_fd );
            }
            else
            {
                close( slave_fd );
                dup2( master_fd, STDIN_FILENO );
                execlp( "/bin/cat", "cat", (char*)0 );
            }
        }
    }

    return 0;
}

您甚至可以为子进程添加延迟,它仍然有效。所以父进程可以在子进程做任何事情之前退出:

~ # temp_test
~ # command
cat: read error: Input/output error

~ #

编辑:

有点不同的例子,因为 cat 的错误打印会导致混淆:

        if( child_pid )
        {
            const char command[] = "command\n";
            close( master_fd );
            write( slave_fd, command, sizeof(command) );
            close( slave_fd );
        }
        else
        {
            char buffer[100];
            ssize_t i;
            ssize_t len;

            close( slave_fd );

            do
            {
                len = read( master_fd, buffer, sizeof(buffer) );
                for( i = 0; i < len; i++ )
                    printf("%c", buffer[i] );
            } while( len > 0 );
        }

结果:

~ # temp_test
command
~ #
于 2012-07-31T13:07:00.080 回答