Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何确定硬盘是否正在休眠或旋转?_C_Linux - Fatal编程技术网

C 如何确定硬盘是否正在休眠或旋转?

C 如何确定硬盘是否正在休眠或旋转?,c,linux,C,Linux,我的程序经常轮询磁盘以进行更改,但我不希望它们唤醒它们,也不希望它们等待10秒直到可以访问为止 我知道,在命令shell中,我可以使用hdparm-C/dev/sda来确定驱动器是处于活动/空闲还是待机模式。但hdparm确实需要根权限,并且默认情况下未安装,因此我无法在程序中使用它 如何对C函数执行相同的操作?hdparm使用/dev/sda上的SCSI ioctl来获得电源模式。这通常需要root用户,因为普通用户对块设备没有读/写权限 如果已安装并运行udisks2,则可以通过在系统总线上

我的程序经常轮询磁盘以进行更改,但我不希望它们唤醒它们,也不希望它们等待10秒直到可以访问为止

我知道,在命令shell中,我可以使用
hdparm-C/dev/sda
来确定驱动器是处于活动/空闲还是待机模式。但hdparm确实需要根权限,并且默认情况下未安装,因此我无法在程序中使用它


如何对C函数执行相同的操作?

hdparm使用
/dev/sda
上的SCSI ioctl来获得电源模式。这通常需要root用户,因为普通用户对块设备没有读/写权限

如果已安装并运行udisks2,则可以通过在系统总线上调用:

  • 服务:org.freedesktop.UDisks2
  • 对象路径:/org/freedesktop/UDisks2/drives/
  • 方法:org.freedesktop.UDisks2.Drive.Ata.PmGetState

udisks2以root用户身份运行,以获取必要的电源状态(待机/活动/空闲),但任何可以访问系统总线的应用程序都可以查询udisks2。

如果您知道Windows或MacOS的答案,如果我尝试移植程序,也可以使用它们。您使用的是ssd或hdd还是混合型?这只有在硬盘上才有意义。在ssd或混合型硬盘上,它可能已经在缓存中,因此不会麻烦“旋转”。您是否需要观察目录(或文件)的更改,以了解何时完成写入?您可能对inotify
API感兴趣。我问这个问题是因为我不明白您的目的。您正在寻找一种非root方式来获取HDD的电源模式状态(不依赖于hdparm)?我对hdparm做了一个非常简短的了解,它看起来相当直接地查询HDD(发送ATA命令以获取状态)。我不需要解释它的用途。我知道这是可能的,因为gdisk可以做到。当设备处于睡眠状态时,它会显示“zzz”字母。所以我想我可以绕开阅读源代码,但似乎我必须再次回答我自己的问题。我知道gdisk不需要root权限来显示这些信息。我确信有一种方法可以从“/sys/block/sda”获得它,但是使用什么路径呢。另外,如果它是一个硬盘驱动器或SDD,那么udisk2是每个GNOME和KDE的必选部分吗?在这种情况下,我可以使用它。当你说gdisk时,你是说“GNOME磁盘”,GUI应用程序吗?它使用这个dbusapi。我不认为gdisk命令行实用程序将以非root运行,它需要打开块设备。我认为udisks2将是大多数GNOME/KDE环境的一部分,尽管可能需要卸载