Вопрос
Я распространяю программное обеспечение, которое использует оптический диск, и на полной скорости по умолчанию оно слишком шумно, чтобы быть приемлемым. Моя цель состоит в том, чтобы снизить скорость диска с помощью ioctl, но я не знаю, как найти/dev/disk (n) из/тома/MyDisk/Application.
Следующее-то, что у меня есть до сих пор, но я не хочу, чтобы путь диска был жестким.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <IOKit/storage/IOCDMediaBSDClient.h>
int main () {
// ------------------------------------
// Open Drive
// ------------------------------------
int fd = open("/dev/disk1",O_RDONLY);
if (fd == -1) {
printf("Error opening drive \n");
exit(1);
}
// ------------------------------------
// Get Speed
// ------------------------------------
unsigned int speed;
if (ioctl(fd,DKIOCCDGETSPEED,&speed)) {
printf("Must not be a CD \n");
}
else {
printf("CD Speed: %d KB/s \n",speed);
}
// ------------------------------------
// Close Drive
// ------------------------------------
close(fd);
return 0;
}
Решение
Возможно, вам придется пройти записи диска в /dev, открывая каждый, а затем используя какой -то другой ioctl (), чтобы идентифицировать их тип.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <IOKit/storage/IOCDMediaBSDClient.h>
int main( int argc, char *argv[])
{
int i, fd;
unsigned short speed;
char disk[40];
for (i = 0; i < 100; ++i)
{
sprintf( disk, "/dev/disk%u", i);
fd = open( disk, O_RDONLY);
if (fd != -1)
{
if (ioctl( fd, DKIOCCDGETSPEED, &speed))
{
printf( "%s is not a CD\n", disk);
}
else
{
printf( "%s CD Speed is %u KB/s\n", disk, speed);
}
close( fd);
}
}
return 0;
}
На моем старом MacBook Pro, без диска на DVD -драйве, он говорит мне, что ни DISK0, ни DISK1 не являются дисками CD. С загруженным диском (и кодом, зафиксированным для использования неподписанного шорт для скорости), он сообщает/dev/disk2 в качестве компакт -диска со скоростью 4234 кб/с.