#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); } } |
原帖由 思一克 于 2009-7-16 14:31 发表
谁的全局?
在一个进程里面是唯一的。
在2个进程里面呢?fd在不同进程里面自己是自己的。数字无任何关系。就是可以是相等的,也可以不相等。
而你FORK出的不同进程,如果没有某个进程独有的文件操作代码 ...
原帖由 babyonetwo 于 2009-7-16 22:41 发表
恩,是我没说清楚。
俩个无关的进程之间传递文件描述符并不是简简单单的把文件描述符的编号传过来。
是在接受进程中创建一个新的描述符,指向内核文件表中与发送进程发送的描述符所指向的一样的那个文件。
一 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |