我在C中使用openpty创建一个pty,并在master / parent和slave / child之间共享它。孩子可以fork / exec并将文件描述符传递给其他程序。我想给孩子注入命令,但是如果我立即通过它们就会迷路。如何从父进程判断有人阻止了stdin的输入?我碰巧在SUSE 10上工作,但我更喜欢一个独立于发行版的解决方案。
编辑:这个问题的答案对我来说仍然很有趣,但可能与问题无关。我稍后会谈到的。
代码的简化版本是使用script源代码(某些标题可能需要修复),并添加行
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,请随时回答。
答案 0 :(得分:1)
据我所知,文件描述符无法在访问另一个进程之后继续存在。但是,您可以在线程之间共享它们。
至于何时知道何时需要阅读,我会尝试在阅读集中使用select
和相应的文件描述符。
答案 1 :(得分:0)
当我写给主人fd时,我注意到有关丢失东西的同样问题。
使用slave fd进行写入可以避免问题。并且主人fd为孩子的stdin。 这样:
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
~ #
修改强>
有点不同的例子,因为错误打印出猫导致混淆:
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
~ #