确定一个pty是否有编程要求input

我在C中使用openpty创build一个pty,并在master / parent和slave / child之间共享它。 孩子可以fork / exec并将文件描述符传递给其他程序。 我想给孩子注射命令,但是如果我立即通过,他们会迷路。 我怎么能告诉父进程,有人阻止从标准inputinput? 我碰巧在SUSE 10上工作,但我更喜欢发行版独立解决scheme。

编辑:这个问题的答案仍然是有趣的,但可能不是相关的问题。 我会在稍后讨论。

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

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是否可以随时回答。

据我所知,文件描述符将不能幸免于另一个进程 。 不过,你可以在线程之间共享它们。

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

当我写信给fd的时候,我注意到了同样的问题。

通过使用slave 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 ~ #