gpt4 book ai didi

linux - 什么情况下是在前台或后台进行关闭/关闭?

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:17 26 4
gpt4 key购买 nike

我正在服务器端的套接字上执行中止关闭,使用:

struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
setsockopt(s, SOL_SOCKET, SO_LINGER, &so_linger, socklen_t)sizeof(so_linger));

shutdown(s, SHUT_WR);
close(s);

其中 s 是我要关闭的套接字。

它可以工作,但我有时会遇到问题,它似乎会影响某些服务器而不是其他服务器。有些在 Ubuntu 上运行,有些在 CoreOS 上运行。它在 CoreOS 上运行良好。

在 Ubuntu 上,尽管调用了 close,但我还是从 epoll_wait 收到了一个与套接字相关的事件。

我以为这会立即发生。但我认为如果您使用非阻塞 I/O,情况可能并非如此。

这本质上意味着我在 epoll_wait 中收到事件,这些事件的 ev.data.ptr 值集指向已被销毁的内容。

那么问题来了,这是真的吗?半关闭不会从 epoll 中删除事件描述符,并且关闭不会与非阻塞 i/o 同步?

因此,如果我不再需要这些事件,我实际上应该使用 EPOLL_CTL_DEL 手动删除描述符?

最佳答案

关闭套接字确实会将其从 epoll 集中清除。但有一个警告。引用epoll man page:

> Q6  Will closing a file descriptor cause it to be removed from all
epoll sets automatically?

A6 Yes, but be aware of the following point. A file descriptor is a
reference to an open file description (see open(2)). Whenever a
file descriptor is duplicated via dup(2), dup2(2), fcntl(2)
F_DUPFD, or fork(2), a new file descriptor referring to the same
open file description is created. An open file description
continues to exist until all file descriptors referring to it
have been closed. A file descriptor is removed from an epoll set
only after all the file descriptors referring to the underlying
open file description have been closed (or before if the file
descriptor is explicitly removed using epoll_ctl(2)
EPOLL_CTL_DEL).This means that even after a file descriptor
that is part of an epoll set has been closed, events may be
reported for that file descriptor if other file descriptors
referring to the same underlying file description remain open.

因此,可能会在调用 close 的套接字上报告事件。不确定您的测试是否可以在某些平台上正常工作。当然,我认为这与异步 I/O 无关。

关于linux - 什么情况下是在前台或后台进行关闭/关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39842554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com