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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передать stdin 
V
    Опции темы
chubaka
Дата 5.5.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

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



Как вызвать программу и передать ей stdin ?

Добавлено через 10 минут и 54 секунды
Через pipe'ы можна ?
PM MAIL   Вверх
MAKCim
Дата 5.5.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



да


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 5.5.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

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



У меня есть программа, и в ней 2 разных способа вызова дочернего процесса. Хотелось бы связать с тем уже уже имееться.

Вариант 1:

Код
    
    FILE * m_pipe = popen(getenv("SCRIPT_FILENAME"), "r");        
    int m_size = 80;
    char buf[m_size + 1];
    while (fgets(buf, m_size, m_pipe) != NULL)
    {
    (void)printf("%s", buf);
    }
    pclose(m_pipe);


Вариант 2:

Код

    int pipedes[2];
    pid_t pid;
    pipe(pipedes);
    pid = fork();
    
    
    if (pid > 0)
    {
    close(pipedes[1]);
    
    char buffer[1024 + 1];

    FILE * stream = fdopen(pipedes[0], "r");    
    while (fgets(buffer, 1024, stream) > 0)
    {
        (void )printf("%s", buffer);
    }
    
    fclose(stream);

    close(pipedes[0]);
    }
    else
    {
    close(pipedes[0]);
    dup2(pipedes[1], STDOUT_FILENO);
    
    char *my_argv[] = {getenv("SCRIPT_FILENAME"), NULL};
    execve(getenv("SCRIPT_FILENAME"), my_argv, environ);
    
    close(pipedes[1]);
    return 0;
    }    


Также имеется: STDIN (типа FILE *) - текущий входной поток, и его нужно передать в дочерний процесс. Можна както связать с уже имеющимся кодом ? Тоесть передать STDIN в дочерний процесс. 
PM MAIL   Вверх
MAKCim
Дата 5.5.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Код

FILE * input; /* нужно передать на stdin дочернего процесса */
...
else
    {
    close(pipedes[0]);
    dup2(fileno(input), STDIN_FILENO);
    dup2(pipedes[1], STDOUT_FILENO);



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

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



Тоесть так ? 

Код

FILE * input = stdin; /* нужно передать на stdin дочернего процесса */
...
else
    {
    close(pipedes[0]);
    dup2(fileno(input), STDIN_FILENO);
    dup2(pipedes[1], STDOUT_FILENO);


Так почемуто не работает.
PM MAIL   Вверх
MAKCim
Дата 5.5.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(chubaka @  5.5.2008,  12:25 Найти цитируемый пост)
Тоесть так ? 

нет
stdin и так наследуется дочерним процессом
в этом случае dup2() не нужен
если нужно "подсунуть" процессу что-то отличное от stdin на стандартный вход, тогда применяется dup2() как показано выше

Это сообщение отредактировал(а) MAKCim - 5.5.2008, 12:30


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

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



MAKCim, понял, спасибо!
PM MAIL   Вверх
chubaka
Дата 5.5.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

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



К сожалению проблема не решена.


MAKCim, вы правы, дочерний процесс наследует stdin. Но он вызывает execve, и stdin не переходит на вызываемый execve'ом процесс. Как передать stdin именно туда ? 
PM MAIL   Вверх
chubaka
Дата 5.5.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

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



Вот нашел пример, там именно то что нужно, но у меня не получается. Да и там 2 fork()'а, не пойму зачем.

http://www.erack.de/download/pipe-fork.c
PM MAIL   Вверх
MAKCim
Дата 5.5.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(chubaka @  5.5.2008,  13:25 Найти цитируемый пост)
Но он вызывает execve, и stdin не переходит на вызываемый execve'ом процесс. Как передать stdin именно туда ?  

execve() не влияет на открытые процессом файлы
вот пример
Код

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>

/*
 * data - файл вида
 * ------------------------
 * c
 * b
 * a
 * ------------------------
 */
#define PATH      "data"
#define PROGRAM   "/bin/sort"

int main() {
    int fd = open(PATH, O_RDONLY);
    pid_t pid = fork();
    if (pid == 0) {
        dup2(fd, STDIN_FILENO);
        execve(PROGRAM, NULL, NULL);
    }
    wait(NULL);
    return 0;
}


Это сообщение отредактировал(а) MAKCim - 5.5.2008, 16:39


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 5.5.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

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



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

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

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


 




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


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

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