任何人都可以解释我,
IOCTL?IOCTL?我有一个在AIX框中运行的Perl脚本.
该脚本尝试从某个目录打开一个文件,但由于该文件没有读取权限,因此无法读取该文件,但我得到了一个不同的错误inappropriate ioctl for device.
它不应该说类似的no read permissions for file东西吗?
这条inappropriate ioctl for device消息是什么意思?
我该如何解决?
编辑:这是我在做的时候发现的strace.
open("/local/logs/xxx/xxxxServer.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE,
0666) = 4 _llseek(4, 0, [77146], SEEK_END) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc14f8) = -1 ENOTTY
(Inappropriate ioctl for device)
我正在尝试在只有bash和原始基础实用程序的系统上执行ioctl调用.
有没有办法在shell脚本中的/ dev中执行任意ioctl命令(如果params只是整数),而不编写C/perl/python程序?像"magic_ioctl/dev/console 30 1 2"这样的东西会调用"ioctl(open("/ dev/console"),30,1,2);".
是否可以检测笔记本电脑的盖子何时打开或关闭?从我所读到的,这是不可能的,但是SO已经帮助我完成了不可能的事情.
我发现的唯一可能是正确的方向是MSDN博客文章,关于报告电源按钮所需的IOCTL.操作系统调用它们是否有可能"嗅"这些?
我正在使用VB.NET,但会接受任何语言的建议.感谢您的时间和建议.
编辑:我的软件将(最终)覆盖盖子关闭时发生的操作(基于用户偏好),因此不能选择关闭盖子时通常发生的暂停和其他操作.
我正在尝试将ATA命令发送到Windows中的物理磁盘,并从设备获取响应.
注意:在这种情况下,我想发送
IDENTIFY DEVICE(0xEC)命令.设备将响应512字节的数据块.(特别是我对第119行的第0位感兴趣 - 设备对TRIM命令的支持).
我知道我需要CreateFile用来打开设备:
handle = CreateFile(
"\\.\PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ,
nil, // no security attributes
OPEN_EXISTING,
0, // flags and attributes
nil // no template file
);
Run Code Online (Sandbox Code Playgroud)
但在此之后,我陷入困境,无法做什么.
我想过发送0xEC使用[DeviceIoControl][4]:
// const ATACommand_IdentifyDevice = 0xEC;
uint bytesReturned = 0;
DeviceIoControl(handle,
0xEC, // IO Control Code
nil, // input buffer not needed
0, // input buffer is zero bytes
@buffer, // output buffer to store …Run Code Online (Sandbox Code Playgroud) 我想使用ioctl与我的内核模块进行通信.我已经为内核模块编写了两个c程序,其他用于用户模式.编译内核模块时出现此错误:
错误:初始化程序中指定的未知字段'ioctl'
在这一行:
struct file_operations Fops = {
.read = device_read,
.write = device_write,
.ioctl = device_ioctl, ------> at this point error is occuring.
.open = device_open,
.release = device_release,
};
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样.
谢谢
我可以在一个小型终端应用程序中使用ioctl设置RTS,但不能在我的Mac插件代码中设置,尽管两者都运行相同的代码.在插件中,我只能"获取"串口标志/引脚,但不能"设置"它们.在终端应用程序中,我可以"获取并"设置"它们.我得到了ENODEV的错误.错误号码是19,消息是"设备不支持操作".
如果这是一个安全问题(在浏览器的上下文中)有没有办法获得使用ioctl修改标志的权限?我有一个连接到usb端口的串行设备.我使用FTDI vcp(虚拟COM端口)驱动程序.Windows端的一切都很流畅.顺便说一句,我使用Safari和Firefox获得相同的结果.以下是我的代码:
int disableRTS ()
{
char fd, ret, flags;
// open device
if ((fd = open("/dev/cu.mydevice", O_RDWR | O_NDELAY)) < 0)
{
fprintf(stderr, "failed to open device");
return -1;
}
// Get the current state of the bits
ioctl(fd, TIOCMGET, &flags);
fprintf(stderr, "Flags are %x.\n", flags);
flags &= ~TIOCM_RTS; // Disable the RTS bit
ret = ioctl(fd, TIOCMSET, &flags);
if (ret == -1)
fprintf(stderr, "TIOCMSET failed\n");
else
fprintf(stderr, "TIOCMSET succeeded. flags: %x.\n", flags);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
=========
在我的驱动程序的file_operations结构中,我有:
struct file_operations Fops = {
read: device_read,
write: device_write,
unlocked_ioctl: device_ioctl,
...
};
Run Code Online (Sandbox Code Playgroud)
即没有使用ioctl字段.这是否足以避免Big Kernel Lock并在没有任何同步的情况下进入device_ioctl()?或者我是否必须在代码的用户空间部分更改ioctl()调用?
我似乎不同的抽象之间纠结的USB堆栈上..有什么不同betweeen IOCTL_USB_RESET和USBDEVFS_RESET解雇对一个USB设备?这两个调用最终会在接口上触发相同的低级操作,还是有区别?
我注意到USBDEVFS_RESET有时用'相当于重新插入和重新枚举设备'来描述,而我自己发现,触发IOCTL_USB_RESET(由libusb的usb_reset()调用完成)确实会触发重置消息dmesg但没有新的"枚举",这将导致通常我猜多线USB检测和识别消息.
由于IOCTL_USB_RESET解决我的问题(卡住usb设备)是不可行的,甚至不会触发重新计算,有没有机会USBDEVFS_RESET做得更好?