#include #include #include #include int main(void) { struct sockaddr_in laddr= {.sin_family=AF_INET, .sin_port=htons(5001), .sin_addr={INADDR_ANY}}; struct sockaddr_storage addr; int skt,alen=sizeof(addr); fd_set r,w,e; struct timeval to; if (-1==(skt=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))err(1,"opening"); if (-1==bind(skt,(struct sockaddr*)&laddr,sizeof(laddr)))err(1,"bind"); fprintf(stderr,"Listening....\n"); if (-1==listen(skt,1))err(1,"listen"); switch(fork()){ case -1: err(1,"fork"); case 0: sleep(1); // Ensure parent wins the race. fprintf(stderr,"closing...\n"); close(skt); // block here until parent returns from select() fprintf(stderr,"closed\n"); return 0; default: FD_ZERO(&r); FD_ZERO(&w); FD_ZERO(&e); to.tv_sec=10; to.tv_usec=0; FD_SET(skt,&r); fprintf(stderr,"selecting...\n"); if(-1==(s=select(skt+1,&r,&w,&e,&to)))err(1,"select"); fprintf(stderr,"selected\n"); } } return 0; }