Error: child process close a socket inherited from parent
Hi,
As illustrated in the following simple sample:
import sys
import os
import socket
class Server:
def __init__(self):
self._listen_sock = None
def _talk_to_client(self, conn, addr):
text = 'The brown fox jumps over the lazy dog.\n'
while True:
conn.send(text)
data = conn.recv(1024)
if not data:
break
conn.close()
def listen(self, port):
self._listen_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._listen_sock.bind(('', port))
self._listen_sock.listen(128)
self._wait_conn()
def _wait_conn(self):
while True:
conn, addr = self._listen_sock.accept()
if os.fork() == 0:
self._listen_sock.close() # line x
self._talk_to_client(conn, addr)
else:
conn.close()
if __name__ == '__main__':
Server().listen(int(sys.argv[1]))
Unless I comment out the line x, I will get a 'Bad file descriptor'
error when my tcp client program (e.g, telnet) closes the connection to
the server. But as I understood, a child process can close a unused
socket (file descriptor).
Do you know what's wrong here?
--
Life is the only flaw in an otherwise perfect nonexistence
-- Schopenhauer
narke
--
http://mail.python.org/mailman/listinfo/python-list
Re: Error: child process close a socket inherited from parent
On 2011-05-29, narke wrote:
> Hi,
>
> As illustrated in the following simple sample:
>
> import sys
> import os
> import socket
>
> class Server:
> def __init__(self):
> self._listen_sock = None
>
> def _talk_to_client(self, conn, addr):
> text = 'The brown fox jumps over the lazy dog.\n'
> while True:
> conn.send(text)
> data = conn.recv(1024)
> if not data:
> break
> conn.close()
>
> def listen(self, port):
> self._listen_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> self._listen_sock.bind(('', port))
> self._listen_sock.listen(128)
> self._wait_conn()
>
> def _wait_conn(self):
> while True:
> conn, addr = self._listen_sock.accept()
> if os.fork() == 0:
> self._listen_sock.close() # line x
> self._talk_to_client(conn, addr)
> else:
> conn.close()
>
> if __name__ == '__main__':
> Server().listen(int(sys.argv[1]))
>
> Unless I comment out the line x, I will get a 'Bad file descriptor'
> error when my tcp client program (e.g, telnet) closes the connection to
> the server. But as I understood, a child process can close a unused
> socket (file descriptor).
>
> Do you know what's wrong here?
>
>
I forgot to say, it's Python 2.6.4 running on linux 2.6.33
--
Life is the only flaw in an otherwise perfect nonexistence
-- Schopenhauer
narke
--
http://mail.python.org/mailman/listinfo/python-list
Re: Error: child process close a socket inherited from parent
On 2011-05-29, Chris Torek wrote:
> In article
> narke wrote:
>>As illustrated in the following simple sample:
>>
>>import sys
>>import os
>>import socket
>>
>>class Server:
>>def __init__(self):
>>self._listen_sock = None
>>
>>def _talk_to_client(self, conn, addr):
>>text = 'The brown fox jumps over the lazy dog.\n'
>>while True:
>>conn.send(text)
>>data = conn.recv(1024)
>>if not data:
>>break
>>conn.close()
>>
>>def listen(self, port):
>>self._listen_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>self._listen_sock.bind(('', port))
>>self._listen_sock.listen(128)
>>self._wait_conn()
>>
>>def _wait_conn(self):
>>while True:
>>conn, addr = self._listen_sock.accept()
>>if os.fork() == 0:
>>self._listen_sock.close() # line x
>>self._talk_to_client(conn, addr)
>>else:
>>conn.close()
>>
>>if __name__ == '__main__':
>>Server().listen(int(sys.argv[1]))
>>
>>Unless I comment out the line x, I will get a 'Bad file descriptor'
>>error when my tcp client program (e.g, telnet) closes the connection to
>>the server. But as I understood, a child process can close a unused
>>socket (file descriptor).
>
> It can.
>
>>Do you know what's wrong here?
>
> The problem turns out to be fairly simple.
>
> The routine listen() forks, and the parent process (with nonzero pid)
> goes into the "else" branch of _wait_conn(), hence closes the newly
> accepted socket and goes back to waiting on the accept() call, which
> is all just fine.
>
> Meanwhile, the child (with pid == 0) calls close() on the listening
> socket and then calls self._talk_to_client().
>
> What happens when the client is done and closes his end? Well,
> take a look at the code in _talk_to_client(): it reaches the
> "if not data" clause and breaks out of its loop, and calls close()
> on the accepted socket ... and then returns to its caller, which
> is _wait_conn().
>
> What does _wait_conn() do next? It has finished "if" branch in
> the "while True:" loops, so it must skip the "else" branch and go
> around the loop again. Which means its very next operation is
> to call accept() on the listening socket it closed just before
> it called self._talk_to_client().
>
> If that socket is closed, you get an EBADF error raised. If not,
> the child and parent compete for the next incoming connection.
Chris,
Thanks, you helped to find out a bug in my code.
--
http://mail.python.org/mailman/listinfo/python-list
A ClientForm Question
Does anyone here use ClientForm to handle a HTML form on client side?
I got a form, within which there is a image control, it direct me to
another page if i use mouse click on it. the code of the form as
below:
...
...
So write below code to 'click' the image button,
forms = ParseResponse(urlopen(url))
form = forms[0]
urlopen(form.click("ZoomControl1:Imagebutton2"))
unfortunatly, however, when the code run, it just got a page which is
not the one i desired ( i actually wish to get the same page as i
'click' the button). I guess that is "onclick=" statement cause
something weird, but I do not understand it. And, in the source
containing the form, i found nowhere the Page_ClientValidate() resides.
What's wrong?
-
narke
--
http://mail.python.org/mailman/listinfo/python-list
Re: A ClientForm Question
John J. Lee wrote, > See second bullet point under "Why does .click()ing on a button not work for me?". Thanks for you advice. However, after read through the FAQs, I have not managed to find a solution for my problem. I belive my button is coupled with some Java script which mess thing up and there is no a easy solution. Am I right? - narke -- http://mail.python.org/mailman/listinfo/python-list
Distribute Non Library
My simple tool writing in python get bigger and bigger and I think I'd better split my code into several files. But, unlike what in some other languages, there is no way to compile these several files into a single executable. Before I splitting my simple tool program, I just put it in /usr/local/bin and run, very simple. Now I have to consider distribute a lot of files in a whole. I know distutils can help, but I feel it is a little uncomfortable, since I am not sharing a library, I am not sharing any thing. I just want to refactory my code. Is there a better solution to my case? Can I simply create a directory in /usr/local/bin and put my script and other used files into the directory? Does distutils help in this case? Thanks in advance. -- Life is the only flaw in an otherwise perfect nonexistence -- Schopenhauer narke -- http://mail.python.org/mailman/listinfo/python-list
Re: Distribute Non Library
On 2010-09-12, Glazner wrote: > On Sep 12, 5:10 am, narke wrote: >> My simple tool writing in python get bigger and bigger and I think I'd >> better split my code into several files. But, unlike what in some other >> languages, there is no way to compile these several files into a single >> executable. Before I splitting my simple tool program, I just put it in >> /usr/local/bin and run, very simple. Now I have to consider distribute >> a lot of files in a whole. I know distutils can help, but I feel it is >> a little uncomfortable, since I am not sharing a library, I am not >> sharing any thing. I just want to refactory my code. Is there a better >> solution to my case? Can I simply create a directory in /usr/local/bin >> and put my script and other used files into the directory? Does >> distutils help in this case? >> >> Thanks in advance. > > try : > python mayApp.zip > > myApp.zip <--> all your files + a __main__.py file as a starting > point... looks also not decent :( i want my tool appear as an executabe, not an zip. but thank you anyway. -- Life is the only flaw in an otherwise perfect nonexistence -- Schopenhauer narke -- http://mail.python.org/mailman/listinfo/python-list
Re: Distribute Non Library
On 2010-09-12, Diez B. Roggisch wrote: > narke writes: > >> My simple tool writing in python get bigger and bigger and I think I'd >> better split my code into several files. But, unlike what in some other >> languages, there is no way to compile these several files into a single >> executable. Before I splitting my simple tool program, I just put it in >> /usr/local/bin and run, very simple. Now I have to consider distribute >> a lot of files in a whole. I know distutils can help, but I feel it is >> a little uncomfortable, since I am not sharing a library, I am not >> sharing any thing. I just want to refactory my code. Is there a better >> solution to my case? Can I simply create a directory in /usr/local/bin >> and put my script and other used files into the directory? Does >> distutils help in this case? > > Consider using setuptools + console entry points. With these, you will > automatically generate a shell-script to execute for your otherwise > eggified and easy installable package. > > Diez That's really attracting. I will try, thanks! -- Life is the only flaw in an otherwise perfect nonexistence -- Schopenhauer narke test post -- http://mail.python.org/mailman/listinfo/python-list
Re: Distribute Non Library
On 2010-09-12, CM wrote: > On Sep 11, 11:10 pm, narke wrote: >> My simple tool writing in python get bigger and bigger and I think I'd >> better split my code into several files. But, unlike what in some other >> languages, there is no way to compile these several files into a single >> executable. > > Sure there is. py2exe, py2app, cx_freeze, etc. Also good solution! Thanks for the help. And, cx_freeze looks even workable on my Linux. Great. -- Life is the only flaw in an otherwise perfect nonexistence -- Schopenhauer narke test post -- http://mail.python.org/mailman/listinfo/python-list
smtplib with Google
Hi, Can anyone please show me a workable example that can let me use google's smtp server to send out a message? Thanks. -- Life is the only flaw in an otherwise perfect nonexistence -- Schopenhauer narke -- http://mail.python.org/mailman/listinfo/python-list
Re: smtplib with Google
On 2010-09-13, member thudfoo wrote: > On Mon, Sep 13, 2010 at 9:20 AM, narke wrote: >> >> Hi, >> >> Can anyone please show me a workable example that can let me use >> google's smtp server to send out a message? Thanks. >> > > Go here: > > http://code.activestate.com/recipes/langs/python/ > > and search for this > > gmail Thanks! -- Life is the only flaw in an otherwise perfect nonexistence -- Schopenhauer narke -- http://mail.python.org/mailman/listinfo/python-list
