Messages in this thread | | | Date | Mon, 25 Nov 2013 13:05:05 -0500 | From | Jason Baron <> | Subject | Re: disappearing listen()ed SO_REUSEPORT sockets across fork() when using epoll |
| |
On 11/22/2013 12:53 PM, Shawn Landden wrote: > Hello, when running the attached program on 3.12 child processes > are missing a socket fd opened, set with SO_REUSEPORT, listen()ed to, > and added to epoll_ctl(). > > This is the output I get when pointing "wget http://localhost:5555/" > at the attached program: > > main PID 31591 > PID 31634 started > PID 31634 accept()ed connection > PID 31635 started > PID 31636 started > PID 31635 accept() failed: Bad file descriptor > PID 31636 accept() failed: Bad file descriptor > PID 31634 accept()ed connection > PID 31634 accept()ed connection > PID 31634 accept()ed connection > PID 31634 accept()ed connection > > > While I would expect something like: > > main PID 31591 > PID 31634 started > PID 31634 accept()ed connection > PID 31635 started > PID 31636 started > PID 31635 accept()ed connection > PID 31636 accept()ed connection > > -more new processes, but inversely proportional to number of listening processes > -accept() always returns successfully > >
The 'close(sockfd);' looks to be racing with the accept() calls. Removing seems to get the result you are looking for.
Thanks,
-Jason
| |