Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Перенаправление вывода  (Прочитано 1047 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн miksayer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
Перенаправление вывода
« : 09 Апреля 2010, 17:20:04 »
Мне нужно написать что-то вроде небольшого интерпретатора команд. Пишу используя execvp, каждую команду обрабатываю в отдельном процессе. Нужно еще реализовать перенаправление вывода команды в файл(т.е. как > в баше). Предполагаю, что это делается через pipe, но я не смог с ним разобраться. Объясните, пожалуйста, как им правильно воспользоваться, чтобы прочитать вывод команды, вызываемой через execvp.
ЗЫ Вот уже существующий код:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[], char * envp[])
{
  while (1)
  {
    pid_t p;
    char command[512];
    char * args[32];
    char * pch;
    int i = 0;
   
    printf("%s$ ", getcwd(command, 512));
    fgets(command, 512, stdin);
    command[strlen(command) - 1] = '\0';

    for (
         i = 0, args[0] = strtok(command, " ");
         args[i] != NULL;
         i++, args[i] = strtok(NULL, " ")
        ) {};
   
    p = fork();
    if ( p == 0 )
    { 
        execvp(args[0], args);
        if (strcmp(args[0], "exit") != 0 && strcmp(args[0], "cd") != 0) fprintf(stderr, "%s : error : command error\n", argv[0]);
        return 1;
    }
    else if ( p > 0 )
    {
      if (strcmp(args[0], "exit") == 0)
      {
        wait(p);
        exit(EXIT_SUCCESS);
        return 0;
      }
      else if (strcmp(args[0], "cd") == 0)
      {
        if (chdir(args[1]) != 0)
        {
          fprintf(stderr, "%s : error : change dir error\n", argv[0]);
          //return 1;
        }
      }
      wait(p);
    }
    else if ( p == -1)
    {
      fprintf(stderr, "%s : error : cannot create child process\n", argv[0]);
      return 1;
    }
  }
  return 0;
}

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Перенаправление вывода
« Ответ #1 : 09 Апреля 2010, 17:40:58 »
http://symmetrica.net/unix-linux/ - все довольно подробно разжевано, и на русском.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн miksayer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
Re: Перенаправление вывода
« Ответ #2 : 09 Апреля 2010, 18:27:31 »
спасибо, хорошая книга
буду разбираться

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Перенаправление вывода
« Ответ #3 : 11 Апреля 2010, 20:36:20 »
Я вот так делал...
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 11 Апреля 2010, 20:37:44:
Ключевой момент -

std::ios::sync_with_stdio(true);
//ассоциируем stdout с нашим файлом
f = freopen( filename.toStdString().c_str(), "w+t", stdout);

эта штука перехватывает не только потоки std::, а вообще все )))

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.