2012-07-30 24 views
4

我正在C中使用openpty創建一個pty,並在master/parent和slave/child之間共享它。孩子可以fork/exec並將文件描述符傳遞給其他程序。我想給孩子注射命令,但是如果我立即通過,他們會迷路。我如何從父進程告訴別人有人阻止從stdin輸入?我碰巧在SUSE 10上工作,但我更喜歡獨立於發行版的解決方案。確定一個pty是否有編程要求輸入

編輯:這個問題的答案對我來說仍然很有趣,但可能與問題無關。我會在稍後談談。

代碼的簡化版本。將使用script源代碼(部分標題可能需要被固定),和大

for (;;) { 
前添加線

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

主要是

我一直在執行從腳本CSH,但後來我發現,腳本命令被傾倒一些垃圾(如六看)

^[[>0;115;0c 

到父母的標準輸入。如果我執行一個bash shell,那麼沒有任何東西會被拋棄,程序會很好地注入命令。

我仍然對被問的問題的答案感到好奇,但顯然與我的問題不再相關,因爲還有其他事情正在進行。如果任何人知道如何看到一個pty是否正在閱讀,可隨時回答。

+0

如果兩者都是我建造n房子,那麼你可以同步它們。可能是通過'signals'?還發布你的代碼。 – tuxuday 2012-08-01 07:59:59

回答

1

據我所知,文件描述符將無法存活到另一個進程。不過,你可以在線程之間共享它們。

至於知道什麼時候有東西要讀,我會嘗試使用select與讀取集中適當的文件描述符。

+0

文件描述符在fork()之前存在。所以在fork()之後,兩個進程(子進程和父進程)都獲得了文件描述符。因此,不需要在現有進程之間傳輸文件描述符。 – SKi 2012-07-31 12:06:21

+0

我想知道什麼時候有人正在閱讀,選擇閱讀fds會告訴我有人寫了。 – MWB 2012-07-31 14:23:55

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 
~ # 
+0

我不確定你在這裏展示的是什麼,據我可以告訴貓沒有讀取任何東西,因爲「貓:讀取錯誤:輸入/輸出錯誤」表示你忘記在孩子上運行login_tty,因此孩子不能使用pty,因爲它不是控制過程。 – MWB 2012-07-31 15:47:26

+0

@MWB:cat打印「command \ n」,然後輸出錯誤信息。也許貓是個糟糕的例子,因爲它會將錯誤行結束。如果你願意,我可以改變這個例子嗎? – SKi 2012-08-01 07:42:41

相關問題