Linux:编写一个“控制”shell的C程序

时间:2011-01-20 12:50:03

标签: c linux shell controls

假设我们在终端上运行了一个shell,比如/ dev / pts / 1。 shell已经运行,我们无法重新启动它。

现在我们要编写一个“控制”shell的C程序,即它本身会为用户提供类似shell的界面,读取用户的输入,将其传递给/ dev / pts /上的真实shell 1,让它执行它,读取shell的输出并将其打印回给用户。

我知道如何完成这项任务的一半:我知道如何收集用户的输入并将此输入注入“真实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执行它。但是,我现在不知道如何读取shell的输出。

任何提示?

3 个答案:

答案 0 :(得分:5)

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

我用管道来控制tty。

答案 1 :(得分:2)

请查看libpipeline。也许这会对你有帮助......

答案 2 :(得分:2)

有些程序允许您更改流程的控制终端:reptyrinjcode是两个此类程序。

我确实认为他们切断了另一个终端,因此根据您的需要,这可能适合也可能不完全适合。