Задача: запустить из своей программы дочернюю, передать ей через ее stdin информацию и прочитать то, что она выводит на свой stdout. Моя программа почему то не работает. Вариантов тут два - либо я делаю что то совсем неправильное, либо просто не умею работать с md5sum, запущеной с аргументом '-'. Подскажите, где грабли?
По моему, проблемма тут вот в чем.
По сути, тебе нужен двунаправленный обмен, верно?
основная ->(строка) -> форкнутая(шифрование) -> (зашифрованная строка) -> основная (вывод).
Фишка, в том, что неименованный канал - однонаправленный, т.е. один процесс только пишет, а другой - только читает. Поэтому - либо выводить зашифрованное в форкнутом процессе, либо юзать другие способы (IPC?).
Мне нужно вычислить хэш строки, формируемой во время выполнения программы. Пока я реализовал это с помощью файлов (моя программа передает строку через stdio md5sum, вывод которой перенаправлен в произвольный файл (md5sum - > /tmp/hash). После чего программа просто считывает первые 32 байта этого файла. Но этот вариант не совсем изящный. Есть еще вариант встроить функцию расчета хэша в свою программу (я это уже делал, благо все с примерами описано в RFC). Просто я считаю, что раз есть уже программа, вычисляющая md5 хэш, нестоит переписывать ее функциональность.
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 тут никак не поможет. Поэтому я и задаю вопрос, а возможно ли перенаправление и ввода и вывода одновременно впринципе?
IMHO, встроить функцию шифрования в программу - самый верный вариант.
Можно еще, посмотреть, какую библиотеку использует md5sum и выудить нужную функцию оттуда (тоже правильный вариант, ибо пользователям может не понравиться необходимость иметь md5sum в своей системе, а к тому что прога требует библиотеку мы как-то спокойнее относимся ).
Если уж обязательно использовать каналы, то можно попробовать по-тупому открыть два пайпа (2xpipe), и юзать их независимо.
(MedVed @ Воскресенье, 07 Августа 2005, 15:40) писал(а):IMHO, встроить функцию шифрования в программу - самый верный вариант.
Можно еще, посмотреть, какую библиотеку использует md5sum и выудить нужную функцию оттуда..