问题标签 [ioctl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
673 浏览

system - 是否可以在没有系统调用的情况下从用户空间“唤醒”linux内核进程?

我正在尝试修改管理特殊硬件的内核模块。用户空间进程每毫秒执行 2 次 ioctl() 系统调用以与模块通信。这不符合我的实时要求,因为 2 个系统调用有时需要很长时间才能执行并超出我的时间段。我知道使用 mmap 我可以共享一个内存区域,这很棒,但是如何在没有 ioctl() 的情况下与模块同步数据交换?

0 投票
3 回答
12669 浏览

javascript - 在 node.js (ioctl SIOCGIFCONF) 中检索网络接口列表

我是 node 新手,我正在使用node_pcap来破解一个 node 应用程序来捕获数据包数据并用它做一些有趣的事情。捕获数据的输入之一是要监听的网络接口,即“eth0”。

我认为如果我能以编程方式查找系统上可用的接口并将它们呈现给程序的用户并允许他们选择要收听的接口,那将是非常棒的。在 C 语言中,我将使用ioctl(或带有 winsock 的 ioctlsocket)使用 SIOCGIFCONF。

我的问题是,目前是否存在在节点中执行此操作的机制?我已经搜索了很多,还没有找到任何这样的解决方案。

如果此功能当前不存在,我会假设我可以使用 ioctl 在 C/C++ 中编写模块绑定来完成此操作。

感谢您的时间!

0 投票
2 回答
1668 浏览

c - recv() 延迟

我有两个使用套接字编程进行通信的程序。最初,我将指定编号。关于他们必须在彼此之间交换消息的时间的跳数。每次它收到一条消息时,它都会将它的 id 附加到它上面。因此,字符串每次都会变大。我的程序在 8000 跳时运行良好,但是在超过 8000 跳之后,虽然程序 p1 发送了一个长度为 16388 的字符串,但 p2 确定套接字中只有 16385 可以读取。我使用 ioctl() 来确定套接字中准备接受 recv() 的字符数量,然后在 char * 变量中接收它...

是否因为 p1 中的 send() 和 p2 中的 recv() 存在延迟,所以 p2 仅识别套接字中的 16385 个字符?

例如:如果 P1 发送长度(16388)

P2 仅接收以下长度(16385)

0 投票
1 回答
2061 浏览

linux - 我们可以使用多个线程对同一个文件描述符进行并行轮询和 ioctl

我有一个多线程应用程序,其中一个线程轮询我的伪字符驱动程序的 FD。其他线程可以对 ioctl 调用使用相同的 FD 吗?

我在 FD 上使用 epoll。

我的猜测是肯定的。我想知道是否有人尝试过这个。如果是这样,结果如何?

0 投票
1 回答
1705 浏览

c - ioctl() 用于 C 中的套接字编程

我正在使用 ioctl() 读取套接字程序中缓冲区中的字符数。但是,有时,当缓冲区的填充延迟时,ioctl() 会将其误解为消息的结尾。如果我要使用 ioctl() 来了解传入消息的长度,如何避免这种情况。此外,我不知道我将收到的消息的大小,因此我无法在静态缓冲区 recv() 中接收它。

谢谢,马诺伊

0 投票
1 回答
1246 浏览

c - freebsd中ioctl的实现

我想知道如何ioctl在 FreeBSD 中实现字符设备的命令。我已经写了一个字符设备,open() close() read() write()但我不知道我应该传递什么参数ioctl_handler。有谁知道的原型d_ioctl_t

0 投票
2 回答
27898 浏览

bash - 如何在 shell 脚本中调用 ioctl?

我正在尝试在只有 bash 和原始基本实用程序的系统上执行 ioctl 调用。

有没有什么方法可以在 shell 脚本中执行任意 ioctl 命令(如果参数只是整数)到 /dev 中的特定设备文件,而无需编写 C/perl/python 程序?像“magic_ioctl /dev/console 30 1 2”这样的东西会调用“ioctl(open(“/dev/console”), 30, 1, 2);”。

0 投票
2 回答
1640 浏览

encryption - Linux 2.6.18 SCSI SPIN 和 SPOUT SG_IO ioctl 到 sg LTO5 设备

我正在尝试在我的 fuse 文件系统中使用ioctl来利用 LTO5 设备的硬件加密。应该很简单,用 cdb 设置一个 io_hdr:

并根据所选算法提供关键页面。当我执行 SG_IO ioctl时,我返回 0 并且 SCSI 感觉全为 0 。

现在,这就是奇怪的地方。写入设备的数据永远不会加密。我将磁带切换到另一个驱动器并进行 SCSI 读取,数据都是明文形式。

因此,下一步是执行 SCSI SPIN 命令以查看 SPOUT 命令是否已执行,即使所有返回都表明已执行。在 SPOUT 之后,我立即为安全状态页面 (0x20) 发送一个 SPIN:

同样,从 SG_IO ioctl返回值 0和全零感。但是我返回的页面是我放入驱动器的 SPOUT 关键页面。我确信这不是来自驱动器,因为它具有我发送的密钥,这绝对是 SCSI 规范,不,不。顺便说一句,我对两个 SCSI 命令都使用了完全不同的缓冲区,并将 SPIN 页面 memset 为零只是为了更好地衡量。sg 驱动程序正在提供此数据以响应 SPIN。

任何人都可以阐明这种行为吗?

Linux archive.xxxxx.xxx 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:21:01 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux

sg3_utils-libs-1.25-5.el5

sgpio-1.2.0_10-2.el5

mt-st-0.9b-2.2.2

我将ioctl命令发送到 /dev/sg5:

我发现 Linux ioctl 系统调用返回 SG_ERR_DID_ERROR [0x07] 在 sg_io_hdr_t 的 host_status 成员中的主机适配器中检测到内部错误。

setltokey.c 代码也在这里:http ://www.circlesoft.com/setltokey.c

0 投票
2 回答
15925 浏览

c++ - 将 IOCTL 发送到 Windows 设备驱动程序 - CreateFile 失败

我想向连接到我的计算机(win7 64 位)的 PC/SC 阅读器发送 IOCTL 命令。为了发送 IOCTL 命令,我需要一个 HANDLE 到我无法创建的设备。

该设备在设备管理器中列为“OMNIKEY 1021”,物理设备对象名称为“\Device\USBPDO-15”。使用“winobj”工具,我可以检测到symlinks:usb #vid_076b&pid_1021#5&291f6990&0&1#{50dd5230-ba8a-11d1d1-bf5d-0000f805f530} USB#Vid_076b&pid_1021#5&291f6990&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

我的问题:我无法使用 CreateFile 函数创建此设备的有效句柄:

我在 MSDN/Google 上发现了几种可能的格式,可用作 CreateFile 函数的 lpFileName 参数,但它们似乎都不起作用:

代码示例

笔记:

  • 返回的句柄总是无效的
  • 始终以管理员身份运行,因此权限应该不是问题

编辑:

解决方案:

  • PC/SC 服务拥有设备的独占所有权,因此任何调用“CreateFile”的尝试都会失败。
  • 解决方案是内核空间驱动程序,它允许您将 IRP 传递给驱动程序。(我能够实现 KMDF 过滤器驱动程序来更改发送/接收到设备的数据)
0 投票
1 回答
1927 浏览

python - 检查 Linux 终端缓冲区中的额外字符

我尝试getch()在 Python 中实现函数,它还应该返回特殊键(如 F1-F12 和箭头键)的字符列表。这些特殊键按顺序生成多个字符。因此getch()在阻塞模式下读取一个字符,然后应该检查输入缓冲区中是否还有额外的字符来获取它们。

我将ioctlcall 与termios.FIONREAD一起使用来获取输入缓冲区中的字节数。它会捕获堆积在缓冲区中的非特殊按键,但会丢失特殊键中的额外符号。似乎有两个不同的缓冲区,如果有人可以解释这一点,那就太好了。

这是交互式示例:

注意sleep(1)中间。如果您在这一秒到期之前按下一个键,输出将是:

对于一秒钟内输入的 5 个普通键(例如 'asdfg'),输出为:

但对于单个箭头键,输出:

这里有两个问题:

  1. 为什么普通按键队列中的4个符号被丢弃?是因为切换到“原始”终端模式吗?getch()如何在不让终端处于“原始”模式的情况下为后续运行保留字符?

  2. 为什么ioctl单个特殊按键的缓冲区为空?这些角色是从哪里来的后续getch()运行?如何检查它们?