- 论坛徽章:
- 0
|
epoll在fork后返回的句柄都相同,下面是代码。
#include <...>
static volatile sig_atomic_t srv_shutdown = 0;
static volatile sig_atomic_t graceful_shutdown = 0;
static void signal_handler(int sig) {
switch (sig) {
case SIGTERM: srv_shutdown = 1; break;
case SIGINT:
if (graceful_shutdown) srv_shutdown = 1;
else graceful_shutdown = 1;
break;
case SIGALRM: break;
case SIGHUP: break;
case SIGCHLD: break;
}
}
int main(void) {
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1, SIG_IGN);
signal(SIGALRM, signal_handler);
signal(SIGTERM, signal_handler);
signal(SIGHUP, signal_handler);
signal(SIGCHLD, signal_handler);
signal(SIGINT, signal_handler);
int num_childs = 5;
if (num_childs > 0) {
int child = 0;
while (!child && !srv_shutdown) {
if (num_childs > 0) {
switch (fork()) {
case -1:
return -1;
case 0:
child = 1;
break;
default:
num_childs--;
break;
}
} else {
int status;
if (-1 != wait(&status)) {
num_childs++;
} else {
switch (errno) {
case EINTR:
break;
default:
break;
}
}
}
}
if (!child) {
if (graceful_shutdown) {
kill(0, SIGINT);
} else if (srv_shutdown) {
kill(0, SIGTERM);
}
return 0;
} else
puts("i am child");
}
int e;
e = epoll_create(256);
if (e > 0) {
if (fcntl(e, F_SETFD, 1) == -1)
printf("fcntl(%d, F_SETFD)", e);
printf("epoll: %d\n", e);
while (!srv_shutdown) {
sleep(1);
}
close(e);
}
} |
|
|