2011-01-20 30 views
13

假設我們有一個在終端上運行的shell,比如/ dev/pts/1。 shell已經在運行,我們不能重新啓動它。Linux:寫一個'控制'一個shell的C程序

現在我們要編寫一個'控制'shell的C程序,即它本身會爲用戶提供一個類似shell的接口,讀取用戶的輸入,並將它傳遞給/ dev/pts上的真實shell/1,讓它執行它,讀取shell的輸出並將其打印回給用戶。

我知道該怎麼做這個任務的一半:我知道如何收集用戶的輸入,並注入該輸入到「真正的外殼」:

#include <fcntl.h> 
#include <sys/ioctl.h> 
#include <stdio.h> 

#define SIZE 100 

int main(int argc, char** argv) 
{ 
if(argc>1) 
    { 
    int tty = open(argv[1], O_WRONLY|O_NONBLOCK); 

    if(tty!=-1) 
    { 
    char *buf,buffer[SIZE+1]; 

    while(1) 
     { 
     printf("> "); 
     fgets(buffer, SIZE, stdin); 
     if(buffer[0]=='q' && buffer[1]=='u' && buffer[2]=='i' && buffer[3]=='t') break; 
     for(buf=buffer; *buf!='\0'; buf++) ioctl(tty, TIOCSTI, buf); 
     } 

    close(tty); 
    } 
    else printf("Failed to open terminal %s\n", argv[1]); 
    } 

return 0; 
} 

上述會把你輸入到外殼中運行終端(在第一個參數中給出它的名字)並讓shell執行它。但是,我現在不知道如何讀取shell的輸出。

任何提示?

+2

你試過從tty讀嗎? – 2011-01-20 12:54:43

回答

1

有一些程序可以讓你改變一個進程的控制終端:reptyrinjcode是兩個這樣的程序。

但是,我確實認爲他們切斷了另一個終端,所以根據您的需要,這可能會或可能不適合。

4

您可以使用pipes。 Linux shell允許重定向。

我用管道來控制tty's。

相關問題