2009-09-03 8 views
0

ポーリングループを開始した後、最初の反復後に表示されるすべてのメッセージは、ターミナルでEnterキーを押して表示する必要があります。Pythonでポーリングソケットの問題

#!/usr/bin/python 
import socket, select, os, pty, sys 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(('', 5007)) 
s.listen(5) 

mypoll = select.poll() 
mypoll.register(s.fileno()) 

while True: 
    print "poll time" 
    subr = mypoll.poll() 
    for x in subr[0]: 

     if x == s.fileno(): 
      conn, addr = s.accept() 

      pid, fd = pty.fork() 
      if pid != 0: 
       mypoll.register(fd) 
       print "done. go back to poll now" 
      else: 
       print "forked" 
       #handles new connection 

     else: 
      data = os.read(x,1024) 
      print data 
+0

このプログラムはおそらく私が多くの月に見た流れに従うのが難しいでしょう。ここで基本的なエラーを修正する必要があります。あなたは、親と同時に接続を受け入れることを再開する子供をフォークしている - 悪い音だ。あなたは、ポーリングループで子供の制御端末を登録していますが、受け入れられた接続は登録していませんか? – leeeroy

+0

新しいフォークを処理する場所を無限ループにするのを忘れていました。しかし、彼らはデータを持っていた後にのみ、 –

答えて

1

最初の反復の後、あなたはpty fdを登録していないので、それをポーリングしていますか?そしてそのfdは決してソケットfdと等しくないので、あなたはpty fdをos.readします。あなたの端末からそれを読んでいるのではないですか?そして、それを "データを印刷する"ために返すように入力しませんか?

+0

すべてのFDのは、最後のelseステートメントに行くべきである パス:真しばらく :私はと 「新しい接続を#handles」ので、私は を置き換えることができ、私はそれを編集ことがしたいです私は読まなければならない。 –