Messages in this thread | | | Date | Wed, 03 Nov 2004 14:26:40 +0100 | From | Gerrit Bruchhäuser <> | Subject | accept does not return in case a signal arrives |
| |
Dear Kernel-team,
on Linux, 'accept' system call does not return in case I send SIGTERM to my application; while it does on OSF-Alpha.
Given the following sample:
,----[ main.cc ] | #include <sys/types.h> | #include <sys/socket.h> | #include <errno.h> | #include <string.h> | #include <stdio.h> | #include <stdlib.h> | #include <resolv.h> | #include <signal.h> | | #define CHECK_RET_M(arg, x) \ | if (-1 == (x) && errno != EINTR) { \ | printf("System call '%s' failed: %s\n", #arg, strerror(errno)); \ | exit(1); \ | } | | typedef struct sockaddr SA; | | static void TermHandler(int signu) | { | // Nothing | } | | int main(int argc, char *argv[]) | { | // Create signal handler 4 SIGTERM | signal(SIGTERM, &TermHandler); | | // Create listening socket... | // argv[1] will be the port number! | int port = atoi(argv[1]); | int listen_fd = socket(AF_INET, SOCK_STREAM, 0); CHECK_RET_M(socket, listen_fd); | | struct sockaddr_in servaddr; | bzero((char *) &servaddr, sizeof(servaddr)); | servaddr.sin_family = AF_INET; | servaddr.sin_addr.s_addr = htonl(INADDR_ANY); | servaddr.sin_port = htons(port); | | // Bind the socket and switch its state to 'listen'... | int r = bind(listen_fd, (SA *) &servaddr, sizeof(servaddr)); CHECK_RET_M(bind, r); | int backlog = 1000; | r = listen(listen_fd, backlog); CHECK_RET_M(listen, r); | | // Wait until client tries to connect... | struct sockaddr_in cliaddr; | socklen_t clilen = (socklen_t) sizeof(cliaddr); | int conn_fd = accept(listen_fd, (SA *) &cliaddr, &clilen); | | // If SIGTERM arrives ... the following message should be printed! | printf("EXIT NOW\n"); | return 0; | } `----
Compiled once on each of the systems: $> g++ -D_POSIX_PII_SOCKET -o main main.cc
Execute in 1st shell: $> ./main 10000
Execute in 2nd shell: $> ps -ef | grep -v grep | grep main $> kill -TERM <pid-of-main>
Results (in 1st shell, on OSF): EXIT NOW $>
Linux exectutes the signal handlers code - but 'accept' does not return. So I've no chance to quit my application in case I have to.
Is there any workaround for my problem?
As I did not subscribe to the list; can you please put me on CC personally?
Many thanks and cheers, Gerrit - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |