Можно ли как-то перехватить сообщения system() (далее в "записать и прочитать из /dev/console или /dev/tty*")

Модератор: Модераторы разделов

Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Можно ли как-то перехватить сообщения system()

Сообщение LuckyStr »

Код: Выделить всё

...
//файла 1.first не существует
system("cat 1.first");
perror("system():");//возвращает "Success"
...

А в это время в консоли:

Код: Выделить всё

$ ./system
cat: 1.first: Нет такого файла или каталога

Вопрос: а можно ли как-то программно перехватить сообщение "cat: 1.first: Нет такого файла или каталога"?
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
Cra3y
Сообщения: 80
ОС: Debian

Re: Можно ли как-то перехватить сообщения system()

Сообщение Cra3y »

man popen/pclose ;)
HP G62 (AMD Phenom II x3 1.8GHz 4GB DDR3 Ram) / Debian 8 amd64
Спасибо сказали:
listasitem
Сообщения: 144
ОС: Debian Lenny 5

Re: Можно ли как-то перехватить сообщения system()

Сообщение listasitem »

PHP

if (is_file($path)) { ... } else { ... }
if (is_dir($path)) { ... } else { ... }
Использую Debian Lenny 5 - счастлив, чего и вам искренне желаю!
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: Можно ли как-то перехватить сообщения system()

Сообщение LuckyStr »

listasitem писал(а):
28.08.2009 11:08
PHP

if (is_file($path)) { ... } else { ... }
if (is_dir($path)) { ... } else { ... }

а на с/с++
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Можно ли как-то перехватить сообщения system()

Сообщение nesk »

LuckyStr писал(а):
28.08.2009 20:03
listasitem писал(а):
28.08.2009 11:08
PHP

if (is_file($path)) { ... } else { ... }
if (is_dir($path)) { ... } else { ... }

а на с/с++


stat (file_path, &stat_buf);
if (S_ISREG (stat_buf.st_mode))
if (S_ISDIR (stat_buf.st_mode))
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: Можно ли как-то перехватить сообщения system()

Сообщение LuckyStr »

nesk писал(а):
28.08.2009 20:16
LuckyStr писал(а):
28.08.2009 20:03
listasitem писал(а):
28.08.2009 11:08
PHP

if (is_file($path)) { ... } else { ... }
if (is_dir($path)) { ... } else { ... }

а на с/с++


stat (file_path, &stat_buf);
if (S_ISREG (stat_buf.st_mode))
if (S_ISDIR (stat_buf.st_mode))

да, но это я так понимаю конкретно для cat, а если так:

Код: Выделить всё

...
system("ls /");
perror("system():");//возвращает "Success"
...

в консоли:

Код: Выделить всё

$ ./system
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Можно ли как-то перехватить сообщения system()

Сообщение nesk »

LuckyStr писал(а):
28.08.2009 21:20
да, но это я так понимаю конкретно для cat, а если так:

Если Вам нужен вывод программы, используйте popen
Если Вам нужен код завершения программы, сохраняйте его в переменную i=system


Что Вы хотите? Сформулируйте вопрос.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: Можно ли как-то перехватить сообщения system()

Сообщение LuckyStr »

Конкретнее, необходимо что-то наподобе стандартного терминала.

Код: Выделить всё

...

char buf[1024];
FILE *infile;

   infile=fopen("/dev/console","r+");

     if(infile!=NULL)
                      fputs("uname",infile);

   while((fgets(buf,1024,infile))!=NULL)
                                                   std::cout<<buf;

...

я иду в правильном направлении?
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Можно ли как-то перехватить сообщения system()

Сообщение nesk »

LuckyStr, скажите, Вы уже пробовали popen?

LuckyStr писал(а):
28.08.2009 23:25
я иду в правильном направлении?

Не совсем. У терминала есть монитор и клавиатура. Если Вы просто пишете на терминал, то информация попадает на монитор. А если Вы пытаетесь читать, то Вы читаете с клавиатуры, а не из буфера монитора.

Вот пример программы http://www.opennet.ru/docs/RUS/bogatyrev/ex_27.html

LuckyStr писал(а):
28.08.2009 23:25
Конкретнее, необходимо что-то наподобе стандартного терминала.

"Что-то наподобие" - это не очень конкретно. Если Вы сформулируете ТЗ, то будет проще Вам помочь, проще подсказать какой из многочисленных инструментов Вам подойдет.



Можно получить буфер терминала с командной строки
$ setterm -dump -file /root/screenlog
А еще можно глянуть программу screen
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Можно ли как-то перехватить сообщения system()

Сообщение frp »

Если нужно просто передавать-получать данные от программ типа ls, cat, ... то идеальный путь - каналы.

Если нужно например вводить пароли автоматически или еще чего-нибудь, для чего программа, которую вызывают, использует некоторые специфические функции, которые использовать с каналами нельзя, то единственный путь - псевдотерминалы (PTY).
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: Можно ли как-то перехватить сообщения system()

Сообщение LuckyStr »

frp писал(а):
29.08.2009 09:54
Если нужно просто передавать-получать данные от программ типа ls, cat, ... то идеальный путь - каналы.

Если нужно например вводить пароли автоматически или еще чего-нибудь, для чего программа, которую вызывают, использует некоторые специфические функции, которые использовать с каналами нельзя, то единственный путь - псевдотерминалы (PTY).

в таком случае необходимы PTY. А как с ними работать, есть у кого-нибудь пример на C/C++ или ссылка на статью, буду очень благодарен
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Можно ли как-то перехватить сообщения system()

Сообщение nesk »

LuckyStr писал(а):
29.08.2009 16:11
в таком случае необходимы PTY. А как с ними работать, есть у кого-нибудь пример на C/C++ или ссылка на статью, буду очень благодарен

Вы мое сообщение проигнорировали? я там дал ссылку на пример (может не самый свежий и самый рабочий, но там есть на что посмотреть)
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: Можно ли как-то перехватить сообщения system()

Сообщение LuckyStr »

nesk писал(а):
29.08.2009 16:20
LuckyStr писал(а):
29.08.2009 16:11
в таком случае необходимы PTY. А как с ними работать, есть у кого-нибудь пример на C/C++ или ссылка на статью, буду очень благодарен

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

нет не проигнорировал, а пытался разобраться в коде и примитивно резюмировал ее под себя, получилось так:

Код: Выделить всё

#include <stdio.h>
#include <sys/types.h>
#include <sys/signal.h>
#include <termio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define PTY         "/dev/ptyp0"          /* master */
/* slave - это часть, которая ведет себя как драйвер терминалов */
#define TTYP      "/dev/ttyp0"          /* slave  */
int     ptyfd;
FILE * ftrace = NULL;

int main(void)
{
   char    c[512];

    int n;

        if((ptyfd = open ( PTY , O_RDWR)) < 0){
                  fprintf(stderr, "Cannot open pty\n"); //exit(2);
               }


          write (ptyfd, "ls", 3);

          n = read (ptyfd, c, 512);
          fprintf (stderr, c);

           read (0, &c, 1);            /* читать букву с клавиатуры */

           write (ptyfd, &c, 1);       /* записать ее на master-pty */

return 0;
}

выводит в :"Cannot open pty", видимо т.к. нет файла /dev/ptyp0. Пытался сделать с

Код: Выделить всё

#define PTY         "/dev/mptx"
, но выводит тоже самое что я и вводил.
Вопрос: как сделать файл /dev/ptyp0 или какой у него аналог?
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Можно ли как-то перехватить сообщения system()

Сообщение Portnov »

Могу порекомендовать книжку М.Джонсон, Э.Троан. Разработка приложений в среде Linux -- Addison-Wesley, 2007. Там создание/работа с псевдотерминалами неплохо описаны. Только вот перевод, к сожалению, из той серии, когда приходится сначала на английский переводить :(
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали: