non-blocking accept() can hang.
Tanaka Akira
akr@fsij.org
Tue Feb 12 01:52:00 GMT 2013
2013/2/8 marco atzeri <marco.atzeri@gmail.com>:
> you can also test by yourself
> http://cygwin.com/snapshots/
I see. I re-tested after replacing /bin/cygwin1.dll.
Unfortunately, the program still block.
(Good news is that ^C is effective.
I don't need to kill the process using Windows task manager.)
% uname -mrsv
CYGWIN_NT-5.1 1.7.18s(0.263/5/3) 20130131 05:33:37 i686
% cat tst-nonblocking.c
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>
void set_nonblock(int fd)
{
int ret;
ret = fcntl(fd, F_GETFL);
if (ret == -1) { perror("fcntl(F_GETFL)"); exit(EXIT_FAILURE); }
ret |= O_NONBLOCK;
ret = fcntl(fd, F_SETFL, ret);
if (ret == -1) { perror("fcntl(F_SETFL)"); exit(EXIT_FAILURE); }
}
int main(int argc, char *argv[])
{
int s, c, ret;
struct sockaddr_un addr;
socklen_t addrlen;
unlink("socketfile");
addrlen = sizeof(addr);
memset(&addr, '\0', addrlen);
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, "socketfile");
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s == -1) { perror("socket(server)"); exit(EXIT_FAILURE); }
set_nonblock(s);
ret = bind(s, (struct sockaddr *)&addr, addrlen);
if (ret == -1) { perror("bind"); exit(EXIT_FAILURE); }
ret = listen(s, SOMAXCONN);
if (ret == -1) { perror("listen"); exit(EXIT_FAILURE); }
c = socket(AF_UNIX, SOCK_STREAM, 0);
if (c == -1) { perror("socket(client)"); exit(EXIT_FAILURE); }
set_nonblock(c);
ret = connect(c, (struct sockaddr *)&addr, addrlen);
if (ret == -1 && errno == EINPROGRESS) { perror("connect"); }
else if (ret == -1) { perror("connect"); exit(EXIT_FAILURE); }
ret = accept(s, NULL, 0);
if (ret == -1) { perror("accept"); exit(EXIT_FAILURE); }
return EXIT_SUCCESS;
}
% gcc -Wall tst-nonblocking.c -o tst-nonblocking
% ./tst-nonblocking
connect: Operation now in progress
(^C is effective)
zsh: interrupt ./tst-nonblocking
--
Tanaka Akira
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cygcheck.out
Type: application/octet-stream
Size: 34995 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20130212/7b73954f/attachment.obj>
-------------- next part --------------
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
More information about the Cygwin
mailing list