5

残念ながら死んだように見える以前の投稿の延長として: select.select issue for sockets and pipes。この投稿以来、私はさまざまなことを無駄に試みてきました. select() モジュールを使用して、パイプまたはソケットにデータが存在するタイミングを識別しています。ソケットは正常に動作しているようですが、パイプに問題があることが判明しています。

次のようにパイプを設定しました。

pipe_name = 'testpipe'
if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)

パイプの読み取りは次のとおりです。

pipein = open(pipe_name, 'r')
line = pipein.readline()[:-1]
pipein.close()

スタンドアロンのコードとしては完全に機能しますが、select.select 関数にリンクしようとすると失敗します。

inputdata,outputdata,exceptions = select.select([tcpCliSock,xxxx],[],[])

inputdata 引数に「pipe_name」、「testpipe」、および「pipein」を入力しようとしましたが、常に「未定義」エラーが発生します。他のさまざまな投稿を見て、パイプにオブジェクト識別子がないためかもしれないと思ったので、試しました:

pipein = os.open(pipe_name, 'r')
fo = pipein.fileno()

select.select引数に「fo」を入れましたが、TypeError: an integer is required が発生しました。また、「この構成の 'fo' を使用すると、エラー 9: 不正なファイル記述子が発生しました。私が間違ったことをしたアイデアをいただければ幸いです。

編集されたコード:私はそれを解決する方法を見つけることができましたが、特にきちんとしたものかどうかはわかりません-コメントに興味があります-パイプの設定を修正しました:

pipe_name = 'testpipe'
pipein = os.open(pipe_name, os.O_RDONLY)
if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)

パイプ読み取り:

def readPipe()
    line = os.read(pipein, 1094)
    if not line:
        return
    else:
        print line

イベントを監視するメイン ループ:

inputdata, outputdata,exceptions = select.select([tcpCliSock,pipein],[],[])
if tcpCliSock in inputdata:
    readTCP()   #function and declarations not shown
if pipein in inputdata:
    readPipe()

それはすべてうまくいきます。私の唯一の問題は、選択からのイベント監視が開始される前に、コードをソケットから読み取ることです。TCP サーバーへの接続が確立されるとすぐに、コマンドがソケット経由で送信されます。このコマンドが送信される前に、パイプが初めて読み取られるまで待機する必要があるようです。

4

1 に答える 1

2

docsによると、 select には fromos.openまたは類似のファイル記述子が必要です。したがって、コマンドとして使用する必要がありselect.select([pipein], [], [])ます。

または、epollLinux システムを使用している場合に使用できます。

poller = epoll.fromfd(pipein)
events = poller.poll()
for fileno, event in events:
  if event is select.EPOLLIN:
    print "We can read from", fileno
于 2013-09-13T12:43:25.150 に答える