Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенаправление ввода, вывода. 
:(
    Опции темы
pablo
Дата 19.5.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: нет
Всего: 6



В Юникс шеле, возможно перенаправить ввод вывод комманд операцией  command < file, command > file, command >> file, но при написании собственного шела, возникла проблема с реализацией сего. 

как я понимаю после ввода команды надо создать процесс, потом запустить комманду, предварительно отделив её от параметров, но что делать потом ? точнее как сделать чтобы вывод(ввод) делался в(из) файла ?

делаю вот так:

Код

void call_execve(char *cmd)
{
    int i;
    printf("cmd is %s\n", cmd);
    if(fork() == 0) {
        i = execve(cmd, my_argv, my_envp);
        printf("errno is %d\n", errno);
        if(i < 0) {
            printf("%s: %s\n", cmd, "command not found");
            exit(1);        
        }
    } else {
        wait(NULL);
    }
}
 


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
GrayCardinal
Дата 19.5.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Код

void call_execve(char *cmd)
{
    FILE * faylo;
    int i;
    printf("cmd is %s\n", cmd);
    if(fork() == 0) {
        faylo = fopen ("/dev/null", "r");
        dup2(fileno (faylo), fileno (stdin));
        i = execve(cmd, my_argv, my_envp);
        printf("errno is %d\n", errno);
        if(i < 0) {
            printf("%s: %s\n", cmd, "command not found");
            exit(1);        
        }
    } else {
        wait(NULL);
    }
}

Откроет файл (/dev/null). Закроет дескриптор 0 (stdin) и скопирует на его место дескриптор faylo. Т.е. stdin теперь /dev/null. Все сложнее конечно, но так на пальцах должно работать. С stdout/stderr аналогично. 


--------------------
PM MAIL WWW   Вверх
bilbobagginz
Дата 19.5.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



в общих словах - забота оболочки (шелла) - превратить командную строку в понятный и правильный ( если возможно ) вид. если ты уже пришел к выводу, что запускать пора, то ты должен запускать дочерние 
процессы, с нужными inpu, output, error.  { в цифрах - это 1-й, 2-й и 3-й  дескрипторы (0,1,2). }
твоя задача сводится к тому, чтобы в процессе вызывающем exec*()  к моменту вызова дескрипторы 0,1,2 были открытые правильные файлы. тогда, при exec() они передадутся "по наследству".
а то что делаешь ты, это надеешься на то, что кто-то уже заменил дескрипторы...

пока.

P.S.
посмотри как это реализуется в тех же tcsh, bash, zsh - благо код доступен и открыт. 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
chaos
Дата 20.5.2006, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



воспользуйся поиском, тема не раз подымалась и я не раз отвечал уже 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.