2013-06-26 1 views
1

이 우수한 페이지에 다음과 같은 기능을 발견하는 경우 비 차단 :루아 io.popen를 사용하여 주소로 ping을 실행, 핑 시간이 초과

function os.capture(cmd, raw) 
    local f = assert(io.popen(cmd, 'r')) 
    local s = assert(f:read('*a')) 
    f:close() 
    if raw then return s end 
    s = string.gsub(s, '^%s+', '') 
    s = string.gsub(s, '%s+$', '') 
    s = string.gsub(s, '[\n\r]+', ' ') 
    return s 
end 

내가 cmd를 = "핑 myknowngoodip으로이 기능을 실행하면 - c 1 "이면 모든 것이 좋다, 즉각 결과와 함께 돌아온다.

그러나

경우 밖으로 핑 시간 (그래서 서버 다운 또는)가 적어도 5 초 전체 프로그램에 대한 차단 나를 위해

가능한 해결책 :

  • 를 사용하여 코 루틴 (그러나 그것들을 설계하는 방법 제대로 작동 얻을 수 있습니까?)

  • 를 사용하여 무언가를 감지 할 파일은 서면 또는 쓰기 잠금 (나는 그렇게 어떻게?)

012 그것은에 도착하는 경우

목표는 다른 IP를 핑 (ping)하고 IP가 살아 있는지 여부를보고하는 copa (http://keplerproject.github.io/copas/) "조회"요청을 수신하는 것입니다. COPAS 위로하고, 실행하는 COPAS 작동하지 않을 지금까지 모든 도움

+0

별도의 스레드가 전용 Lua VM과 함께 있습니까? –

답변

1

io.popen에 대한

많은 감사를 작동합니다. Copas는 파이프가 아닌 소켓 용입니다.

가장 빠른 해결책은 폴링을 사용하는 것입니다. 예 :

local socket = require "socket" 
local waitTime, sleepTime = 5, 0.1 
local endT = os.time() + waitTime 
local result 
os.capture("ping myknowngoodip -c 1 > myoutfile") 
while os.time() <= endT do 
    local pcall_ok, fHand = pcall(io.open, "myoutfile", "r") 
    if pcall_ok then 
     result = assert(fHand:read("*all")) 
     assert(fHand:close()) 
    end 
    socket.sleep(sleepTime) 
end 
if result then 
    -- Success! 
else 
    -- Error :(
end 

또 다른 가능성은 별도의 스레드입니다. LuaLanes은 거기에서 최고의 멀티 쓰레딩 툴킷이지만 메모리 소비면에서 가장 큰 것입니다. 그러나 이것은 다소 관여합니다.

또 다른 옵션은 Copas 또는 LOOP's SocketScheduler으로 소켓을 ping하는 것입니다 (권장 됨, Copas보다 훨씬 좋습니다). 이것은 비동기로 시작할 것입니다. LOOP.SocketScheduler는 훌륭한 coroutine 관리 프레임 워크로서 모든 종류의 것들에 유용하며 위에서 샘플 된 코드 (scheduler : sleep로 socket.sleep 바꾸기, 새로 생성되고 등록 된 코 루틴에서 코드 실행)와 함께 사용할 수 있습니다.

유능한 C 프로그래머라면 C가 작동하도록 할 수도 있습니다. 예 : C 함수를 호출하고, 루아 콜백 함수를 전달하고, ping이 완료되면 새로 생성 된 pthread에서 콜백을 호출합니다.

면책 조항 : 코드가 테스트되지 않았습니다.

관련 문제