From 528839e277fa7777c5499aeb078a7e3c2fbf4eaa Mon Sep 17 00:00:00 2001 From: Qiuwen Lu Date: Thu, 12 Oct 2017 12:28:00 +0800 Subject: 保活连接FD增加CLOEXEC选项。 - 原实现在创建保活链接FD时没有启用CLOEXEC选项,导致从应用调用exec()系统调用后,保活FD继承到子进程,使得从应用退出后,驱动没有及时发现从应用退出。 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infra/src/ctrlmsg.c | 14 +++++++++----- 1 file 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)); -- cgit v1.2.3