标签: ioctl

如何通过ioctl调用或其他方式查明SCSI设备(例如/ etc/sda)是否为磁盘?

如何通过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) {
        perror(dev);
    }
    memset(&m_id, 0, sizeof (m_id));
    rc = ioctl(fd, SG_GET_SCSI_ID, &m_id);
    if (rc < 0) {
        close(fd);
        printf("FAIL: ioctl SG_GET_SCSI_ID, rc=%d, errno=%d\n", rc, errno);
    } else {
        if (m_id.scsi_type …
Run Code Online (Sandbox Code Playgroud)

c linux ioctl scsi driver

6
推荐指数
1
解决办法
4753
查看次数

有人可以帮我替换块设备驱动程序上的"lock_kernel"吗?

谢谢你看这篇文章.我正在尝试修补网络块设备驱动程序.如果您需要查看源代码,请访问http://code.ximeta.com.

我注意到从linux 2.6.37开始,lock_kernel()似乎已被弃用.我读了"ioctl()的新方法",发现设备驱动程序现在应该在操作之前执行特定的锁定.

所以如果可能的话,我想要一些建议.

我在块文件夹部分找到了当前代码中我认为相关的两个部分.

Source 
      block->io.c
           ->ctrldev.c
Run Code Online (Sandbox Code Playgroud)

我把每个片段都放在你的考虑范围内.

io.c包含对lock_kernel的一次调用:

NDAS_SAL_API xbool     sal_file_get_size(sal_file file, xuint64* size)
{
    definitions and declarations etc..

lock_kernel();

#ifdef HAVE_UNLOCKED_IOCTL
    if (filp->f_op->unlocked_ioctl) {   
       some small statements

       error = filp->f_op->unlocked_ioctl(filp, BLKGETSIZE64, (unsigned long)size);

       actions if error or not etc.
   }
#endif

   unlock_kernel(); 
   return ret;
}
Run Code Online (Sandbox Code Playgroud)

并且ctrldev.c包含主要的io函数:

#include <linux/spinlock.h> // spinklock_t
#include <linux/semaphore.h> // struct semaphore
#include <asm/atomic.h> // atomic
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/ide.h>
#include <linux/smp_lock.h>
#include <linux/time.h>

......

int ndas_ctrldev_ioctl(struct inode *inode, struct …
Run Code Online (Sandbox Code Playgroud)

ioctl linux-device-driver linux-kernel

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

有没有办法知道Python套接字中有多少数据可供接收?

我发现我必须使用ioctl.这里有类似的问题:

我的问题是:

  1. 什么是Python中的FIONREAD?如何调用sock.ioctl()来获取可用的字节数?
  2. 如果我在Windows上使用Python 2.5怎么办?socket.ioctl是2.6版中的新增功能.

python sockets ioctl fcntl recv

6
推荐指数
1
解决办法
2936
查看次数

替换ioctl()函数

我正在为小型微控制器应用开发设备驱动程序I/O模型,使用POSIX作为接口设计的指南.我实现ioctl()了控制驱动器/硬件参数的方法 - 例如UART波特率,I2C从设备地址等.

我注意到,那POSIX:2008年名单ioctl(),并<stropts.h>过时.与设备驱动程序通信的推荐替代机制是什么?

c embedded posix ioctl driver

6
推荐指数
1
解决办法
2350
查看次数

物理磁盘大小不正确(IoCtlDiskGetDriveGeometry)

我使用下面的代码来获取物理磁盘大小,但返回的大小不正确.我用其他工具检查了尺寸.

以下代码报告

总磁盘空间:8.249.955.840字节

它应该是

总磁盘空间:8.254.390.272字节

如何检索实际/正确的物理磁盘大小?在USB驱动器和普通硬盘上测试.代码很长,这里将它分开来显示.

结构:

[StructLayout(LayoutKind.Sequential)]
internal struct DiskGeometry {
    public long Cylinders;
    public int MediaType;
    public int TracksPerCylinder;
    public int SectorsPerTrack;
    public int BytesPerSector;
}
Run Code Online (Sandbox Code Playgroud)

原生方法:

internal static class NativeMethods {
    [DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
    public static extern SafeFileHandle CreateFile(
        string fileName,
        uint fileAccess,
        uint fileShare,
        IntPtr securityAttributes,
        uint creationDisposition,
        uint flags,
        IntPtr template
        );

    [DllImport("Kernel32.dll", SetLastError=false, CharSet=CharSet.Auto)]
    public static extern int DeviceIoControl(
        SafeFileHandle device,
        uint controlCode,
        IntPtr inBuffer,
        uint inBufferSize,
        IntPtr outBuffer, …
Run Code Online (Sandbox Code Playgroud)

c# size ioctl disk deviceiocontrol

6
推荐指数
1
解决办法
3789
查看次数

当pty [伪终端]从属fd设置被"tcsetattr"改变时,主端如何无延迟地捕获此事件?

slave fd被另一个应用程序(比如"A")用作串行端口设备.

A将设置其波特率/停止位等.我的应用程序需要此信息.

顺便说一下,有没有办法让只有主fd打开的进程被通知所有ioctl()发给奴隶fd的电话?

linux ioctl pty

6
推荐指数
1
解决办法
877
查看次数

可以使用ioctl()将9针串行端口用作"GPIO"吗?

是否可以使用Linux机箱上的COM端口来读取交换机的值?我认为应该可以使用ioctl(),但我已经努力寻找一个类似的例子.我只需要一个输入,只需要它以高/低值读取.我以为我可以使用ioctl将其中一个引脚设置为高电平,并在该引脚和另一个引脚之间连接一个开关,再次使用ioctl读取第二个引脚的值()

理由是我在车库里有一个可靠的旧服务器,我想做一些会发出哔哔声并告诉车库门是否打开的东西,因为服务器就在门旁边,我觉得这很简单.只需将一个开关连接到com端口的后面(当前未使用)

当然,我可以花几英镑,让自己头疼,并使用arduino或ESP8266,但现在这让我很好奇!

c linux ioctl

6
推荐指数
1
解决办法
1628
查看次数

在ioctl中打开有什么不良副作用?

根据man ioctl,打开文件描述符open可能会导致不必要的副作用.该手册还指出开头O_NONBLOCK解决了那些不必要的问题,但我似乎无法找到原因,也不知道实际的副作用是什么.有人可以解释一下吗?随着ioctl它总是可能和等效*打开文件描述符O_NONBLOCK

注释(来自man ioctl)

为了使用此调用,需要一个打开的文件描述符.通常open(2)调用会产生不必要的副作用,这可以通过给它O_NONBLOCK标志在Linux下避免.

(*我知道这O_NONBLOCK意味着什么,但我不知道这是否影响ioctl调用它会影响其他系统调用.我的程序,用于ioctl从SPI总线写入和读取,与启用该标志完美配合.)

c unix linux posix ioctl

6
推荐指数
1
解决办法
500
查看次数

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

我(出于好奇)一直想知道在x86_64 Linux上定义了ioctl系统调用的用户空间包装器.我的第一个想法是glibc - 在我的Fedora 24盒子上检查已安装版本上的暴露符号之后,我可以看到(除非我做错了)libc将ioctl符号暴露为'W'意味着它是一个弱符号默认实现.misc/ioctl.c中的glibc源代码树中的默认实现似乎是一个存根,只是将errno设置为ENOSYS并返回-1.

从来没有,ioctl工作(显然或我的系统不会很有用).我知道它可能是汇编代码在某个文件中的某个地方以某种方式组装和链接,从而覆盖glibc暴露的弱符号.我也知道应用程序完全可以使用系统调用直接调用ioctl,可以通过glibc syscall包装器直接调用也可以直接使用程序集调用.

也就是说,鉴于库源代码我碰巧观察(libdrm)包含标准的ioctl头文件/usr/include/sys/ioctl.h,并且似乎没有包含我自己可以看到的包装器实现,我想知道我应该在哪里看.

这是我更深入地了解GNU/Linux系统最低级别的一部分.感谢您的任何指示,并且如果之前已经提出过这样的道歉,但如果有的话,我看不到任何答案.

更新:我忽略了上面提到但我还检查了内核映射的虚拟vdso库 - 我只能在其中找到以下内容:

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
Run Code Online (Sandbox Code Playgroud)

更新:看起来我错误的glibc默认定义是存根.正如nos在评论中指出的那样,反汇编表明它正在执行真正的系统调用.我已经发布了一个答案来反映这一点.

c linux ioctl symbols system-calls

6
推荐指数
1
解决办法
358
查看次数

DeviceIoControl 调用失败并显示 Windows 错误代码 183

我正在尝试将缓冲区数据写入 SCSI 设备,但是当我触发 deviceIoControl 调用时,我收到 Windows 错误代码 183。错误代码指示文件已退出,但我无法理解与 IOCTL 调用相关的错误。

CreateFile 函数通过,因为我能够获得适当的设备句柄,如下所示。

int devHandle = DeviceIoControlHelper.CreateFile( deviceName, DeviceIoControlHelper.GENERIC_READ | DeviceIoControlHelper.GENERIC_WRITE, DeviceIoControlHelper.FILE_SHARE_READ | DeviceIoControlHelper.FILE_SHARE_WRITE, IntPtr.Zero, DeviceIoControlHelper.OPEN_EXISTING, Inttr.0Z

但是,当我尝试写入缓冲区时,出现错误:

 dwReturned = 0;
        int b = DeviceIoControlHelper.DeviceIoControl(
                devHandle,
                DeviceIoControlHelper.IOCTL_SCSI_PASS_THROUGH,
                inpBuffer,
                (uint)Marshal.SizeOf(info),
                inpBuffer, //out pDriveLayout,
                (uint)Marshal.SizeOf(info), //(uint)Marshal.SizeOf(typeof(DRIVE_LAYOUT_INFORMATION_EX)),
                out dwReturned,
                IntPtr.Zero);

        Log.Write(Log.TraceLevel_5,"ExecuteDeviceIoControl return pass_through scsistatus = " + info.spt.ScsiStatus);
        if (b == 0)
        {
            int win_err = this.GetWindowsErrorCode();
            Log.Write(Log.TraceLevel_5, "ExecuteDeviceIoControl failed, error =  " + win_err);
            LogMyTrace.Write(LogMyTrace.TraceLevel_5, "ExecuteDeviceIoControl failed, error =  " + win_err);

            this.CloseOpenHandle(devHandle); …
Run Code Online (Sandbox Code Playgroud)

c# windows ioctl iscsi

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