Linux: напишите программу на C, которая "управляет" оболочкой

Предположим, что на терминале имеется оболочка, скажем, /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;
}

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

Любые советы?

Ответ 1

Вы можете использовать pipes. Linux-оболочки разрешают перенаправление.

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

Ответ 2

посмотрите libpipeline. возможно, это поможет вам...

Ответ 3

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

Я действительно верю, что они разъединяют другой терминал, однако, поэтому в зависимости от ваших потребностей это может или не подходит.