gpt4 book ai didi

c - 在一个只读 fd 上进行 IO 多路复用是否比简单地阻塞读取有助于获得更好的性能?

转载 作者:行者123 更新时间:2023-11-30 15:09:01 25 4
gpt4 key购买 nike

据我所知,我认为如果我只需要对一个fd进行读操作,像select/poll这样的IO复用对性能没有任何帮助,甚至会比仅仅阻塞地读取fd带来更多的开销。

但是linux auditd project但是,请在一个读取套接字上使用 select。有人能解释一下它的含义吗?

auditd 代码还在 1 个套接字/1 个管道和 5 个信号上使用 libev。如果我只关心主 netlink 套接字,那么使用阻塞读取是否更好?

我认为可能的场景可能是监听 udp 接收器套接字等。

为了方便起见,附上了代码块。提前致谢!

925 static int get_reply(int fd, struct audit_reply *rep, int seq)
926 {
927 int rc, i;
928 int timeout = 30; /* tenths of seconds */
929
930 for (i = 0; i < timeout; i++) {
931 struct timeval t;
932 fd_set read_mask;
933
934 t.tv_sec = 0;
935 t.tv_usec = 100000; /* .1 second */
936 FD_ZERO(&read_mask);
937 FD_SET(fd, &read_mask);
938 do {
939 rc = select(fd+1, &read_mask, NULL, NULL, &t);
940 } while (rc < 0 && errno == EINTR);
941 rc = audit_get_reply(fd, rep,
942 GET_REPLY_NONBLOCKING, 0);
943 if (rc > 0) {
944 /* Don't make decisions based on wrong packet */
945 if (rep->nlh->nlmsg_seq != seq)
946 continue;
947
948 /* If its not what we are expecting, keep looping */
949 if (rep->type == AUDIT_SIGNAL_INFO)
950 return 1;
951
952 /* If we get done or error, break out */
953 if (rep->type == NLMSG_DONE || rep->type == NLMSG_ERROR)
954 break;
955 }
956 }
957 return -1;
958 }

最佳答案

性能可能会根据平台(在本例中为 Linux)而有所不同,但不会更快。

代码使用 select 的主要原因似乎是它的超时功能。它允许超时读取,而无需实际修改套接字的超时(SO_SNDTIMEOSO_RCVTIMEO)[或者如果套接字根本支持超时]。

关于c - 在一个只读 fd 上进行 IO 多路复用是否比简单地阻塞读取有助于获得更好的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36931522/

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