Articles of ioctl

什么可能的原因可以阻止在Linux上的虚拟terminal?

还是有可能一些进程或其他东西可以阻止虚拟terminal? 或者当尝试访问VT1时应用程序挂起的原因是什么? 看来,这一切正在发生,它挂在functionioctl 。 尤其是,这是失败的代码: int vtno = 1; const char* vtname = "/dev/tty1"; int fd = open(vtname, O_RDWR|O_NDELAY, 0); if (ioctl(fd, VT_ACTIVATE, vtno) < 0) printf("VT_ACTIVATE failed: %s\n", strerror(errno)); if (ioctl(fd, VT_WAITACTIVE, vtno) < 0) printf("VT_WAITACTIVE failed: %s\n", strerror(errno)); 它挂在第二个ioctl 。 当我打断它的时候,我收到了这个消息: VT_WAITACTIVE failed: Interrupted system call 另外,当它在那里等待时,如果我从另一个terminal执行chvt 1 ,那也挂起。

当pty 从设备的fd设置被“tcsetattr”改变时,主设备如何无延迟地捕获这个事件?

从站fd被另一个应用程序(比如“A”)用作串口设备。 A将设置其波特率/停止位等我的应用程序需要这些信息。 顺便说一句,有没有什么办法,只有主FD打开通知所有的ioctl()调用发出到奴隶fd?

列出从用户空间到内核空间的ioctl调用

可能是我的问题听起来更天真了。 但是我想知道是否有可能列出从Linux用户空间到内核空间的ioctl调用。

移植从Unix到linux的ioctl()调用,错误与FIONBIO

我想使用ioctl()来获取准备读取的字节数 我做的方式是: mysocket=socket(….); ioctl(mysocket, FIONBIO, &zero); connect(…..); ioctl( mysocket, FIONREAD, &numBytes ); read(mysocket, buffer, numBytes); 这是在Unix工作正常,现在我必须将其移植到Linux我不断收到错误 错误:“FIONBIO”未在此范围内声明 有一些特定于Linux的头文件? 或者'FIOBIO'在linux中完全不起作用? 我有以下头文件: #include <cstring> #include <sys/socket.h> #include <stropts.h> #include <fcntl.h> #include <stddef.h> #include <sys/un.h> #include <sys/types.h> #include <stdlib.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/select.h> #include <fstream> 我删除了 #include <sys/filio.h> 因为它是抛出错误说sys / filio.h没有find

混淆了ioctl()和内核头文件

据我所知, ioctl()用于向用户空间应用程序公开一个“扩展的”系统调用接口。 ioctl()用于通过一次系统调用提供可扩展的驱动程序特定function,而不是添加特定驱动程序特有的数千个系统调用。 这似乎很清楚。 但是,我试图编译我的第一个应用程序使用ioctl()调用,我开始怀疑我的理解。 具体来说,我想做一个ioctl()调用来“清理”一个eMMC设备。 看一下/usr/include/linux/mmc/ioctl.h (或者在include/uapi/linux/mmc/ioctl.h内核源代码),我可以看到这个结构: struct mmc_ioc_cmd { // Most fields omitted int write_flag; __u32 opcode; __u32 arg; }; 从用户空间,我没有任何问题,包括这个头,并将此结构传递给我的ioctl()调用。 所以这就是我最终的清理片段: int sanitize(int fd) { struct mmc_ioc_cmd command; memset(&command, 0, sizeof(command)); command.write_flag = 1; command.opcode = MMC_SWITCH; command.arg = EXT_CSD_SANITIZE_START << 16; return ioctl(fd, MMC_IOC_CMD, &command); } 我的问题是MMC_SWITCH和EXT_CSD_SANITIZE_START都在内核头文件中定义。 具体来说,在我的内核源代码中,它们都是在include/linux/mmc/mmc.h 。 我在互联网上看到的一切都表示,在构build用户空间项目时, 不要包含来自内核源头的头文件。 […]

将自定义结构types添加到strace

我试图通过ioctl系统调用来反向工程与内核驱动程序交互的用户模式共享对象。 我有一个头文件的定义为内核驱动程序的ioctl接口(即#defines for ioctl命令号,以及发送给ioctl的各种数据的结构定义)。 我看到strace有能力去引用传入系统调用的用户指针,但显然不能去引用传递给ioctl的自定义结构。 有没有一种简单的方法来将我的定义添加到strace,以便我可以将有意义的数据传递到ioctl,而不仅仅是一个指针地址? 我有strace的源代码,并已成功编译/安装它,但我所有的尝试包括我自己的头都没有效果。

Linux如何知道要调用哪个ioctl函数?

以下是用户空间中的ioctl调用: int ioctl(int fd, int cmd, …); 据我所知,当我们想要执行IO操作时,我们用一组请求(命令)来定义我们自己的ioctl函数,把我们的ioctl分配给一个file_operations结构,如下所示: struct file_operations fops = { .read = device_read, .write = device_write, .ioctl = device_ioctl, // device_ioctl is our function .open = device_open, .release = device_release, }; 与用户空间接口相比, device_ioctl函数的定义不同: static long device_ioctl(struct file *f, unsigned int cmd, unsigned long arg) 我认为基于文件描述符,内核可以得到适当的文件结构并调用设备的ioctl 。 这只是一个猜测,因为我找不到通用函数定义,内核根据传入通用ioctl接口的文件描述符fdselect适当的ioctl函数? 我能find的只有3个ioctl定义,但显然那些只是设备的定义,而不是内核: ioctl

iwlist()命令如何扫描无线networking?

我想知道如何iwlist命令扫描可用的无线networking,在Linux中。 我读了它的源代码,并且使用SIOCSIWSCAN进行了ioctl调用来触发扫描,并且SIOCGIWSCAN获得扫描结果。 但是,这些系统调用如何捕获和分析信标帧?

x86_64 Linux上定义的ioctl系统调用的用户空间包装器在哪里?

我(出于好奇)想知道在x86_64 Linux上定义了ioctl系统调用的用户空间包装器。 我的第一个想法是glibc – 在我的Fedora 24盒子上查看已安装版本的暴露符号后,我可以看到(除非我做错了)libc将ioctl符号暴露为“W”,意味着它是一个弱符号一个默认的实现。 在misc / ioctl.c的glibc源代码树中的默认实现似乎是一个存根,只是将errno设置为ENOSYS并返回-1。 从来不less,ioctl的作品(显然或我的系统不会很好用)。 我知道,它可能是汇编代码在一个文件中的某处汇编和链接,从而覆盖glibc公开的弱符号。 我也知道,应用程序完全可以通过系统调用直接调用ioctl,通过glibc系统调用包装或者直接调用。 这就是说,鉴于我正在观察的库源代码(libdrm)包含标准的ioctl头文件/usr/include/sys/ioctl.h,并且似乎没有包含它自己的包装器的实现,我可以看到,我想知道我应该在哪里看。 这是我深入理解GNU / Linux系统最底层的一部分。 感谢任何指针,并道歉,如果这已经问过,但我不能看到任何答案,如果有的话。 更新:我忽略了上面提到,但我也检查了由内核映射的虚拟vdso库 – 我只能find它在以下内容: 0000000000000a00 W clock_gettime 0000000000000db0 W getcpu 0000000000000c40 W gettimeofday 0000000000000000 A LINUX_2.6 0000000000000d90 W time 0000000000000a00 T __vdso_clock_gettime 0000000000000db0 T __vdso_getcpu 0000000000000c40 T __vdso_gettimeofday 0000000000000d90 T __vdso_time 更新:它会出现我是不正确的glibc默认定义是存根(stub)。 正如在评论中指出的那样,反汇编显示它正在执行真正的系统调用。 我已经发布了一个答案来反映这一点。

如何找出SCSI设备(说/ etc / sda)是否通过ioctl调用或其他磁盘?

如何通过ioctl调用或其他方式找出SCSI设备(比如/ dev / sda)是否是磁盘? 我已经尝试了以下,但ioctl调用失败。 我的/ dev / sda是​​一个USB闪存盘。 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <scsi/scsi.h> #include <scsi/sg.h> #include <sys/ioctl.h> int main(int argc, char** argv) { char *dev = "/dev/sda"; struct sg_scsi_id m_id; int rc; int fd; fd = open(dev, O_RDONLY | O_NONBLOCK); if (fd < 0) { […]