Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
2 / 2 / 2
Регистрация: 09.01.2014
Сообщений: 71

Передача команд в терминал и получение ответа

17.11.2015, 06:31. Показов 4965. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Только недавно начал программировать под linux и столкнулся с проблемой: как из программы на c++ передать команду в терминал и получить вывод терминала в программу? что-то никак не могу сообразить. Если с выводом еще есть идеи - перенаправлять вывод c помощью >(хотя до конца не догоняю как все реализовать), то с передачей команд в терминал идей нет. Буду благодарен помощи)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2015, 06:31
Ответы с готовыми решениями:

Передача данных GET и получение ответа
Здравствуйте. Подскажите пожалуйста, как сделать следующее: в console application как можно передать данные GET'ом и получить ответ со...

Несколько команд в терминал через PHP
Привет, форумчане! Интересует способ реализации вот такой ситуации. Есть программа, она принимает данные через консоль, которая требует...

Передача файла в программу через терминал
Добрый день. У меня есть программа которая берет данные из файлов, рассчитывает что ей нужно и записывает в другие файлы. Вот как в ТЗ...

3
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
17.11.2015, 10:44
Лучший ответ Сообщение было отмечено kogramat как решение

Решение

kogramat, вот пример перенаправления ввода-вывода. В качестве потомка запущен bash, а наш процесс все что прочтет из консоли отправляет потомку, а то что потомок отвечает нашему процессу - выводится в терминал.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/select.h>
 
/* вывод ошибок */
static void PANIC(const char *fmt, ...) {
  int errnum = errno;
  va_list args;
  va_start(args, fmt);
  vfprintf(stderr, fmt, args);
  va_end(args);
  if (errnum != 0)
    fprintf(stderr, "(%d: %s)\n", errnum, strerror(errnum));
  exit(EXIT_FAILURE);
}
 
/* процесс потомок, где запущен /bin/bash */
static void be_childish(int to_child[2], int fr_child[2]) {
  fflush(0);
  if (dup2(to_child[0], STDIN_FILENO)  < 0 ||
      dup2(fr_child[1], STDOUT_FILENO) < 0 ||
      dup2(fr_child[1], STDERR_FILENO) < 0)
    PANIC("Failed to set standard I/O in child\n");
  close(to_child[0]);
  close(to_child[1]);
  close(fr_child[0]);
  close(fr_child[1]);
  char *args[] = { "/bin/bash", 0 };
  execv(args[0], args);
  PANIC("Failed to execute %s", args[0]);
}
 
/* процесс родитель */
static void be_parental(int to_child[2], int fr_child[2], pid_t pid) {
  char output[4098], input[258];
  struct timeval timeout;
  fd_set set;
  FILE * flog;
  int rc, total=0; 
 
  printf("Parent PID: %d\n", (int)getpid());
  close(to_child[0]);
  close(fr_child[1]);
 
  sleep(2);
 
  *output = '\0';
  for (;;) {
    /* читаем то что нам ввел пользователь */
    printf("rshell > ");
    *input = '\0';
    fgets(input, sizeof(input), stdin);
    total = strlen(input);
 
    /* отправляем в процесс /bin/bash, то что ввел пользователь */
    if (write(to_child[1], input, total) != total) {
      PANIC("Write failed.");
    }
 
    sleep(1);
 
    /* читаем из процесса баша с таймаутом */
    *output='\0';
    for (;;) {
      /* файловый дескриптор */
      FD_ZERO(&set);
      FD_SET(fr_child[0], &set);
      /* таймаут*/
      timeout.tv_sec = 0;
      timeout.tv_usec = 10000;
      /* проверяем, есть ли что прочесть из файлового дескриптора */
      rc = select(fr_child[0] + 1, &set, NULL, NULL, &timeout);
      if (rc == -1) PANIC("select");
      else if(rc == 0) break; /* таймаут - выходим */
      /* читаем */
      if ((rc = read(fr_child[0], output, sizeof(output)-1)) <= 0) {
        PANIC("Read failed\n");
      }
 
      /* выводим в наш терминал то что прочли из процесса /bin/bash */
      output[rc] = '\0';
      printf(output);
    }
    if (rc > 0 && output[rc-1] != '\n') printf("\n");
  }
 
  /* ждем завершения потомка */
  close(to_child[1]);
  close(fr_child[0]);
  int corpse;
  int status;
  while ((corpse = waitpid(pid, &status, 0)) != pid && corpse != -1)
    PANIC("Got pid %d (status 0x%.4X) instead of pid %d\n",
               corpse, status, pid);
  printf("PID %d exited with status 0x%.4X\n", pid, status);
}
 
/* точка входа в приложение */
int main() {
  pid_t pid;
  int to_child[2];
  int fr_child[2];
  if (pipe(to_child) != 0 || pipe(fr_child) != 0) {
    PANIC("Failed to open pipes\n");
  }
 
  switch ((pid = fork())) {
    case -1: PANIC("Failed to fork\n");       break;
    case  0: be_childish(to_child, fr_child); break;
    default: be_parental(to_child, fr_child, pid); break;
  }
 
  return EXIT_SUCCESS;
}
1
2 / 2 / 2
Регистрация: 09.01.2014
Сообщений: 71
17.11.2015, 14:08  [ТС]
спасибо огромное)))буду пробовать)
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
18.11.2015, 16:05
schdub, не проще ли использовать popen?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2015, 16:05
Помогаю со студенческими работами здесь

Передача данных через терминал по порту
Всем привет!Появился такой вопрос.Допустим я поставил через netcat программу которая записывает введеные данные в текстовый файл file.txt. ...

Передача данных c МК51 по UART и вывод в терминал
Нужно передать 2-х байтовое число через UART по каналу RS-485 на терминал.

STM32F4 Discovery передача данных с акселерометра в терминал
Добрый день, господа форумчане и форумчанки! Прошу вашей помощи. Имеется отладочная плата STM32F4 Dyscovery. Хочу получить данные с...

Получение ответа
Всем привет. Целей день просидел и нигде не нашел решение. Проблема в следующем: Программно отправляю пост запрос, а в ответ...

Получение ответа от сервера
Всем доброго вечера! Есть некоторое ПО, OPC server(KeepServer). При помощи этого ПО я отправляю команды на оборудование (команды...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru