2009-09-03 2 views
0

폴링 루프를 시작한 후 첫 번째 반복 이후에 인쇄 된 모든 메시지는 터미널에서 Enter 키를 눌러 표시되도록합니다.파이썬 소켓 폴링 문제

#!/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"대체 할 수있는 편집 할 수 있으면 좋겠다 내가 읽을 게. –