Linux: напишите программу на C, которая «контролирует» оболочку - PullRequest
14 голосов
/ 20 января 2011

Предположим, у нас на терминале работает оболочка, скажем, / dev / pts / 1. Оболочка уже запущена, и мы не можем перезапустить ее.

Теперь мы хотим написать программу на C, которая будет «контролировать» оболочку, т.е. которая сама предоставит пользователю подобный оболочке интерфейс, прочитает вводимые пользователем данные, передаст их реальной оболочке в / dev / pts / 1, запустите его, прочитайте вывод оболочки и распечатайте его обратно пользователю.

Я знаю, как выполнить половину этой задачи: я знаю, как собрать пользовательский ввод и вставить этот ввод в «реальную оболочку»:

#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;
}

Вышеуказанное передаст ваш ввод оболочке, работающей в терминале (дайте свое имя в первом аргументе), и оболочка выполнит его. Однако я не знаю, как читать вывод оболочки.

Какие-нибудь советы?

Ответы [ 3 ]

5 голосов
/ 19 августа 2011

Для этого можно использовать трубы . Оболочки Linux позволяют перенаправление.

Я использовал трубы для управления tty.

2 голосов
/ 12 августа 2011

Существуют программы, которые позволяют вам изменить управляющий терминал для процесса: reptyr и injcode - две такие программы.другой терминал, однако, в зависимости от ваших потребностей это может или не может точно соответствовать.

2 голосов
/ 12 августа 2011

пожалуйста, посмотрите на libpipeline . может быть, это поможет вам ...

...