标签: ioctl

有关设备映射器 ioctl 的文档?

关于 Device Mapper 的 Red Hat 文档中,它写道:

“设备映射器的应用程序接口是 ioctl 系统调用。”

到目前为止,我知道ioctl被发送到/dev/mapper/control(对于大多数发行版),但似乎我需要深入研究dmsetup、 libdevmapper 或类似的源代码,以了解 ioctl 实际如何工作以及如何使用它们。

是否有任何书籍、讲座或文档对这个主题进行了扩展?我是否陷入了解析复杂源代码的困境?我使用 libdevmapper 而不是 ioctl 系统调用更好吗?ioctl 的手册页过于笼统,在这种情况下没有多大用处。

linux system-calls dm-crypt device-mapper ioctl

6
推荐指数
0
解决办法
1333
查看次数

设备映射器:在 osprober-linux-nvme0n1p7 上重新加载 ioctl 失败:设备或资源繁忙

我遇到了错误

设备映射器:在 osprober-linux-nvme0n1p7 上重新加载 ioctl 失败:设备或资源繁忙

在 Ubuntu Studio 中编译内核时。我的主驱动器使用 ZFS。

显然,这是一个错误:[zfs-root] “device-mapper: reload ioctl on osprober-linux-sdaX failed: Device or resource busy”针对 ZFS 拥有的设备

我该如何解决?

zfs ubuntu bugs ioctl

5
推荐指数
1
解决办法
1835
查看次数

如何在自己的 tty 中运行程序?

我正在搞乱 TIOCSTI,它将数据推送到终端的输入缓冲区。我希望能够在这些数据到达 shell 或将其重定向到文件之前捕获它。

为了更好地说明我正在尝试做的事情:

gcc -x c -o pusher.bin - <<PUSHER
#include <unistd.h>
#include <sys/ioctl.h>
#include <termios.h>

int main() {
  char *c = "echo 'Catch me if you can'\n";
  while(*c) ioctl(0, TIOCSTI, c++);
}
PUSHER
./pusher.bin
Run Code Online (Sandbox Code Playgroud)

如果在我的终端中运行,./pusher.bin将注入echo 'Catch me if you can'\n我的 shell 将立即执行的 tty。如果我运行setsid ./pusher.bin, echo 将不会注入我的终端,但我也无法捕获它。

我想./pusher.bin用一些东西来包装,这样我就可以检查在我的 tty 的输入缓冲区中注入了什么推送器,如果它是裸运行的。

澄清:我知道注入的输入可以在到达我的 shell 的标准输入后被捕获。这种方法虽然在捕获注入的输入方面很有效,但也将捕获正常的用户输入。此外,如果 stdin 已关闭或进程未附加到 tty,则此方法将不起作用。仅这些缺点就使得捕获 stdin 作为通用解决方案不可行。

shell bash terminal tty ioctl

5
推荐指数
0
解决办法
181
查看次数

ioctl 调用会阻塞吗?

我正在围绕 libgpiod 的接口编写一些代码。比如我想设置一条线输出高电平。在底层,libgpiod 打开内核为该行提供的 fd,然后调用ioctl(fd, GPIO_V2_LINE_SET_VALUES_IOCTL, ...).

我的问题是:

  • 这个特定的ioctl()调用(带有GPIO_V2...参数)理论上(可能)是否会像写入任意文件描述符一样阻塞?

  • ioctl()理论上来说,呼叫通常会阻塞吗?例如,首先请求线路还涉及ioctl()芯片的 on a fd。I2C 怎么样ioctl()

  • fd如果它是阻塞的,那么行 struct ( ) 中的底层是否是line->fd_handle->fd我需要在事件循环中等待的底层(例如,epoll()或像 libuv 这样的抽象事件库)?

我试图通过研究来回答这个问题,但是(a)搜索“ioctl”和“blocking”的任何组合只会给出将fd设置为阻塞或不阻塞的结果,并且(b)它不在手册页或内核中我能找到的文档。

file-descriptors linux-kernel gpio ioctl

5
推荐指数
1
解决办法
2991
查看次数

键盘输入是否总是通过控制终端?

从键盘输入的所有输入都通过控制终端是否正确?这意味着如果程序在没有控制终端的情况下运行,它将无法接收任何用户输入。这是否适用于 Linux 中的每种程序?

更新 #1:为了澄清这个问题,当 stdin 被重定向时,我的 Python 寻呼机模块崩溃了

$ ./pager.py < README.rst
...
  File "pager.py", line 566, in <module>
    page(sys.stdin)
  File "pager.py", line 375, in page
    if pagecallback(pagenum) == False:
  File "pager.py", line 319, in prompt
    if getch() in [ESC_, CTRL_C_, 'q', 'Q']:
  File "pager.py", line 222, in _getch_unix
    old_settings = termios.tcgetattr(fd)
termios.error: (25, 'Inappropriate ioctl for device')
Run Code Online (Sandbox Code Playgroud)

这是因为我尝试获取描述符以将键盘输入设置为fd = sys.stdin.fileno(). 当stdin被重定向,它的文件描述符不再与任何键盘输入相关联,因此试图设置它失败input-output control的错误。

我被告知要得到这个controlling terminal …

terminal ioctl controlling-terminal

2
推荐指数
1
解决办法
1686
查看次数