Как сделать неблокирующий канал из командной строки в Solaris? - PullRequest
0 голосов
/ 19 февраля 2009

Я пытаюсь написать скрипт lua, который читает входные данные других процессов и анализирует их. Для этой цели я использую io.popen, и он работает, как и ожидалось, в Windows, но при чтении Unix (Solaris) из блоков io.popen, поэтому сценарий просто ждет, пока что-то не придет, вместо немедленного возврата ...

Насколько я знаю, я не могу изменить функциональность io.popen из скрипта, и если это вообще возможно, я бы предпочел не менять код C, потому что тогда скрипт должен будет быть связан с исправленным двоичным файлом.

Это оставляет меня с какими-либо решениями командной строки?

Ответы [ 2 ]

1 голос
/ 19 февраля 2009

Кажется, ваши проблемы связаны с буферизацией. По какой-то причине канал ожидает, чтобы некоторые данные были прочитаны, прежде чем он позволит открытой программе записать в него больше данных, и кажется, что он меньше строки. Что вы можете сделать, это использовать io.popen (cmd): прочитайте «* a», чтобы прочитать все. Это должно избежать проблемы буферизации. Затем вы можете разбить возвращенную строку на строки с for для строки в string.gmatch ("[^ \ n] +") сделать someting_with (line) end.

Ваше решение состоит в выгрузке выходных данных процесса в файл и чтении этого файла. Вы можете заменить свое использование или io.popen на io.execute и отменить возвращаемое значение (просто отметьте 0).

1 голос
/ 19 февраля 2009

Хорошо, пока нет ответов, но для потомков, если кому-то нужно подобное решение, я сделал более или менее следующее

function my_popen(name,cmd)
    local process = {}
    process.__proc = assert(io.popen(cmd..">"..name..".tmp", 'r'))
    process.__file = assert(io.open(name..".tmp", 'r'))
    process.lines  = function(self)
        return self.__file:lines()
    end
    process.close = function(self)
        self.__proc:close()
        self.__file:close()
    end
    return process
end

proc = my_popen("somename","some command")
while true
    --do stuf
    for line in proc:lines() do
        print(line)
    end
    --do stuf
end
...