Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Работа с stdin и stdout дочернего процесса одновременно в lua

При написании lua скрипта наткнулся на одну вещь: io.popen, судя по документации не может передать одновременно дескрипторы stdin и stdout запускаемого процесса.
Пример проблемного кода:
cmdexecute = function(cmd, input) local f = io.popen(cmd, "w"); if tostring(input) ~= nil then f:write(tostring(input)); end; local l = f:read("*a"); f:close(); return (l); end;
if cmdexecute('xargs ps', 'aux') ~= nil then print 'ps aux что-то выдал'; else print 'ps aux промолчал'; end;
Результат выполнения:
Длинный-длинный вывод ps aux... ps aux промолчал
А должно быть по идее:
ps aux что-то выдал
Вопрос: как получить дескрипторы и stdin, и stdout из popen? Или, возможно, есть какое-то другое решение задачи, без io.popen?
Upd: по причине актуальности вопроса поясняю: решения с ffi допустимы


Ответ

Вам должен помочь модуль lua-subprocess
Функция subprocess.popen принимает последним аргументом таблицу с именованными опциями. Среди них есть опции stdin, stdout и stderr, куда можно передать строку (имя файла), число (системный дескриптор файла), файловый объект или специальную константу subprocess.PIPE, которая создаст пайп для этого потока и сохранит его в возвращаемом объекте.

Комментариев нет:

Отправить комментарий