首页 > 解决方案 > 套接字句柄上不必要的 ioctl(n, TCGETS) 调用

问题描述

为什么 Perl5 似乎隐含地ioctl()对各种文件句柄运行不必要的 tty 检查?

据我了解,这是 Perl5 的长期特性,似乎没有人考虑对其进行更改。ioctl()当我说更改时,我的意思是在您知道不是 tty 句柄的文件句柄上“对Perl5 进行更改以促进启用或禁用此类tty 检查”。

我有一个 TCP/IP 套接字程序,在accept()新套接字返回后,下面strace显示了ioctl()在新句柄上调用的 s。在这种情况下,ioctl()调用是对 CPU 和负载的浪费。当然,如果accept()andioctl()只被调用一次,那没什么意义。然而,随着时间的推移,多个进程、多个ioctl()调用......这一切都加起来了。

有没有一种现有的方法来明确禁用ioctl()对文件句柄和套接字等的这种多余的 tty 检查?

如果它不能被禁用,是否有人认为这种禁用/启用检查的上下文能力是值得的?

这是strace显示客户端套接字初始连接的摘录:

18:21:59.818126 select(8, [6], NULL, NULL, {tv_sec=10, tv_usec=0}) = 1 (in [6], left {tv_sec=9, tv_usec=999997})
18:21:59.818321 accept4(6, {sa_family=AF_INET, sin_port=htons(56124), sin_addr=inet_addr("127.0.0.1")}, [4096->16], SOCK_CLOEXEC) = 7
18:21:59.818419 fcntl(7, F_SETFD, FD_CLOEXEC) = 0
18:21:59.818453 ioctl(7, TCGETS, 0x7ffff5befcd0) = -1 ENOTTY (Inappropriate ioctl for device)

标签: perlsocketsioctl

解决方案


所以你认为应该有一种方法告诉 Perl 检查句柄是否是一个套接字,以跳过执行与套接字无关的代码。

您不必告诉 Perl 这样做;它应该是自动的。它是自动的。调用ioctl是那个检查。

我认为有问题的调用来自这个用于isatty检查应该使用哪种缓冲的子。如果是这样,则调用 toioctl用于检查句柄是否为套接字,或者是否跳过与套接字无关的执行代码。

您是否建议有更好的方法来检查文件句柄是否是套接字?


推荐阅读