summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-10-12 12:28:00 +0800
committerQiuwen Lu <[email protected]>2017-10-12 12:28:00 +0800
commit528839e277fa7777c5499aeb078a7e3c2fbf4eaa (patch)
treedf1a7dccae27b04808be7f6b03b0218f47199404
parentc9283dbd5e884edb6c22ba6c0140f5be98422de2 (diff)
保活连接FD增加CLOEXEC选项。v4.2.27-20171012
- 原实现在创建保活链接FD时没有启用CLOEXEC选项,导致从应用调用exec()系统调用后,保活FD继承到子进程,使得从应用退出后,驱动没有及时发现从应用退出。
-rw-r--r--infra/src/ctrlmsg.c14
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));