LINUX.ORG.RU

popen или pipe?


0

0

Как щас:
формирую файло с переменными и запускаю sh-скрипт в popen на чтение

скрипту передаю в строке вызова это файлов в качестве парамтра
в самом скрипте инклудю это файло с переменными.

что-то делаю в скрипте и вывод отдаю вызывающей программе

что принал из popen вывожу на stdout и удаляю временный файл с параметрами.



Хотелось бы сделать как в execve - сформировать енвероменты и запустить этот скрипт (чтобы не инклудить и не создавать лишних файлов), но важен вывод данных от sh-скрипта!



Как я понял popen это функция, которая форкается и потом открывает sh в pipe?
Я двигаюсь в правильном направлении?
Может у кого есть нечто подобное?

Делаешь 2 пайпа (pipe1 pipe2), потом форкаешься.

В дочке: закрываешь дескриптор 0, дублируешь pipe1[0]; закрываешь дескриптор 1, дублируешь pipe2[1]; запускаешь exec'ом sh -c "<путь к скрипту> параметры"

Теперь можешь скармливать скрипту стандартный ввод в pipe1[1] и читать ответы из pipe2[0]. Только дедлоков опасайся -- если stdio юзаешь, fflush() не забывай. И позакрывай в дочке и папе ненужные концы пайпов.

Die-Hard ★★★★★
()

2Ant0:

Если тебе нужен двусторонний обмен данных со скриптом
то воспользуйся советом Die-Hard (см. выше).

Если же тебе надо передать в скрипт только несколько значений
переменных а потом прочитать вывод скрипта то IMHO лучшим вариантом
будет popen(3). Есть как минимум два варианта:

/* установка переменных в командной строке - аккуратно! */
fp = popen("VAR1='value_for_var1' VAR2=12345 my_script.sh", "r");

или так:

/* изменение environment в родительском процессе */
putenv("VAR1=value_for_var1");
putenv("VAR2=12345");
fp = popen("my_script.sh", "r");

HTH

Onanim
()
Ответ на: комментарий от Onanim

Всем огромное спасибо!
Это именно то, что надо!

Ant0
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.