Перенаправление ввода-вывода

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

n1tr0gen
Сообщения: 149

Перенаправление ввода-вывода

Сообщение n1tr0gen »

Задача: запустить из своей программы дочернюю, передать ей через ее stdin информацию и прочитать то, что она выводит на свой stdout. Моя программа почему то не работает. Вариантов тут два - либо я делаю что то совсем неправильное, либо просто не умею работать с md5sum, запущеной с аргументом '-'. Подскажите, где грабли?

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

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    int fds[2];
    pid_t pid;
    char hash_string[33];
    FILE *input;
    FILE *output;

    pipe(fds);
    pid = fork();
    if(pid == (pid_t)0) {
        dup2(fds[0], STDIN_FILENO);
        dup2(fds[1], STDOUT_FILENO);
        execlp("md5sum", "-", 0);
    } else {
        input = fdopen(fds[0], "r");
        output = fdopen(fds[1], "w");
        fprintf(output, "abc");
        fflush(output);

        fread(hash_string, 32, 1, input);
        hash_string[32] = '\0';
        printf("MD5 hash: %s\n", hash_string);

        waitpid(pid, NULL, 0);
        close(fds[0]);
        close(fds[1]);
    }

    return 0;
}
Спасибо сказали:
MedVed
Сообщения: 112

Re: Перенаправление ввода-вывода

Сообщение MedVed »

По моему, проблемма тут вот в чем.
По сути, тебе нужен двунаправленный обмен, верно?
основная ->(строка) -> форкнутая(шифрование) -> (зашифрованная строка) -> основная (вывод).
Фишка, в том, что неименованный канал - однонаправленный, т.е. один процесс только пишет, а другой - только читает. Поэтому - либо выводить зашифрованное в форкнутом процессе, либо юзать другие способы (IPC?).
МСВС 3.0/Linux Mandrake 8.0
Спасибо сказали:
n1tr0gen
Сообщения: 149

Re: Перенаправление ввода-вывода

Сообщение n1tr0gen »

Мне нужно вычислить хэш строки, формируемой во время выполнения программы. Пока я реализовал это с помощью файлов (моя программа передает строку через stdio md5sum, вывод которой перенаправлен в произвольный файл (md5sum - > /tmp/hash). После чего программа просто считывает первые 32 байта этого файла. Но этот вариант не совсем изящный. Есть еще вариант встроить функцию расчета хэша в свою программу (я это уже делал, благо все с примерами описано в RFC). Просто я считаю, что раз есть уже программа, вычисляющая md5 хэш, нестоит переписывать ее функциональность. ;)
Спасибо сказали:
Ananas
Сообщения: 64

Re: Перенаправление ввода-вывода

Сообщение Ananas »

man popen
Спасибо сказали:
n1tr0gen
Сообщения: 149

Re: Перенаправление ввода-вывода

Сообщение n1tr0gen »

(Ananas @ Воскресенье, 07 Августа 2005, 13:50) писал(а):man popen

Popen я хотел использовать в первую очередь. Не не все так гладко. Если бы Вы сами почитали man страницы по popen, то не давали бы таких советов.
(man popen) писал(а):Since a pipe is by definition unidirectional, the type argument may specify only reading  or writing, not both; the resulting stream is correspondingly read-only or write-only.

Pipe работает только в одном направлении, значит нужно использовать два канала. Popen тут никак не поможет. Поэтому я и задаю вопрос, а возможно ли перенаправление и ввода и вывода одновременно впринципе?
Спасибо сказали:
MedVed
Сообщения: 112

Re: Перенаправление ввода-вывода

Сообщение MedVed »

IMHO, встроить функцию шифрования в программу - самый верный вариант.
Можно еще, посмотреть, какую библиотеку использует md5sum и выудить нужную функцию оттуда (тоже правильный вариант, ибо пользователям может не понравиться необходимость иметь md5sum в своей системе, а к тому что прога требует библиотеку мы как-то спокойнее относимся :) ).
Если уж обязательно использовать каналы, то можно попробовать по-тупому открыть два пайпа (2xpipe), и юзать их независимо.
МСВС 3.0/Linux Mandrake 8.0
Спасибо сказали:
n1tr0gen
Сообщения: 149

Re: Перенаправление ввода-вывода

Сообщение n1tr0gen »

(MedVed @ Воскресенье, 07 Августа 2005, 15:40) писал(а):IMHO, встроить функцию шифрования в программу - самый верный вариант.
Можно еще, посмотреть, какую библиотеку использует md5sum и выудить нужную функцию оттуда..
Спасибо за совет, думаю так и поступить.
Спасибо сказали:
Аватара пользователя
Alagert
Сообщения: 167

Re: Перенаправление ввода-вывода

Сообщение Alagert »

А почему ты не хочешь посмотреть в сторону FIFO. Они работают в оба конца! Кода правда чут больше становиться, но точно работает!
Born to be ROOT
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Перенаправление ввода-вывода

Сообщение flook »

Командой pipe ты создаешь unidirectional pipe. Если тебе надо еще и ответ от фокнутого процесса получить - нужен 2й pipe.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Ananas
Сообщения: 64

Re: Перенаправление ввода-вывода

Сообщение Ananas »

да с popen протупил...

вам нужно два пайпа. использование одного (как в примере) - тот же popen.
Спасибо сказали: