1

我正在尝试使用子进程从 airodump-ng 中获取标准输出,但没有成功。我认为我的代码会导致死锁。

   airodump = subprocess.Popen(['airodump-ng','mon0'],stdin=subprocess.PIPE,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)

    # wait for 15 seconds to find all networks
    time.sleep(15)

    # save the output
    o_airodump = airodump.stdout.read()
    os.kill(airodump.pid, signal.SIGKILL)
    # airodump.terminate
    print(o_airodump)

如何避免这个问题。想不出一个干净的解决方案。

4

2 回答 2

2

不要休眠并等待(这只会导致 airodump 阻塞在一个完整的管道缓冲区上)并且不要使用无限的 read()。communicate() 方法可以满足您的需要:

o_airodump, unused_stderr = airodump.communicate(timeout=15)
airodump.kill()

注意:关于通信的超时参数是在 Python 3.3 中引入的,目前还没有完全推出。;)

于 2012-07-07T17:42:57.730 回答
1
airodump.communicate() 

等待进程终止然后返回(stdout, stderr)

如果你真的推动你总是可以使用 ctypes 直接链接到 c 库。享受黑客攻击。

于 2012-07-07T12:06:38.423 回答