diff options
| author | Qiuwen Lu <[email protected]> | 2017-10-12 12:28:00 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-10-12 12:28:00 +0800 |
| commit | 528839e277fa7777c5499aeb078a7e3c2fbf4eaa (patch) | |
| tree | df1a7dccae27b04808be7f6b03b0218f47199404 /infra/src/ctrlmsg.c | |
| parent | c9283dbd5e884edb6c22ba6c0140f5be98422de2 (diff) | |
保活连接FD增加CLOEXEC选项。v4.2.27-20171012
- 原实现在创建保活链接FD时没有启用CLOEXEC选项,导致从应用调用exec()系统调用后,保活FD继承到子进程,使得从应用退出后,驱动没有及时发现从应用退出。
Diffstat (limited to 'infra/src/ctrlmsg.c')
| -rw-r--r-- | infra/src/ctrlmsg.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/infra/src/ctrlmsg.c b/infra/src/ctrlmsg.c index 09e88a7..060ac1e 100644 --- a/infra/src/ctrlmsg.c +++ b/infra/src/ctrlmsg.c @@ -329,7 +329,11 @@ static void * __epoll_event_loop(void * arg) { struct sockaddr_in remote_addr; socklen_t sz_remote_addr = sizeof(remote_addr); - int conn_fd = accept(listen_fd, (struct sockaddr *)&remote_addr, &sz_remote_addr); + + /* 使用accept4接口,在接收新链接时直接设置非阻塞选项、exec关闭选项 */ + int conn_fd = accept4(listen_fd, (struct sockaddr *)&remote_addr, + &sz_remote_addr, SOCK_CLOEXEC | SOCK_NONBLOCK); + if (conn_fd < 0) { MR_ERROR("Accept remote connnection failed : %s", strerror(errno)); @@ -378,14 +382,14 @@ errout: static int __common_mode_create(struct ctrlmsg_handler * handle) { - int epoll_fd = epoll_create(16); + int epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (epoll_fd < 0) { MR_ERROR("Cannot create epoll fd: %s. ", strerror(errno)); return RT_ERR; } - int event_fd = eventfd(0, EFD_NONBLOCK); + int event_fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); if(eventfd < 0) { MR_ERROR("Cannot create event fd: %s. ", strerror(errno)); @@ -403,7 +407,7 @@ static int __server_mode_create(struct ctrlmsg_handler * handle, struct sockaddr if (ret < 0) return ret; // 监听本地端口,TCP连接 - int listen_fd = socket(AF_INET, SOCK_STREAM, 0); + int listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); if (listen_fd < 0) { MR_ERROR("Create event listen fd failed : %s.", strerror(errno)); @@ -453,7 +457,7 @@ static int __client_mode_create(struct ctrlmsg_handler * handle, struct sockaddr int ret = __common_mode_create(handle); if (ret < 0) return ret; - int conn_fd = socket(AF_INET, SOCK_STREAM, 0); + int conn_fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); if (conn_fd < 0) { MR_ERROR("Cannot create socket for ctrlplane message : %s.", strerror(errno)); |
