2016-03-11 5 views
-1

Я выполнил следующий код, чтобы проверить использование ioctl, и я довольно запутался в результатах.Как ioctl точно работает и как правильно работать с dvd-показаниями?

int main(void) 
{ 
    int id; 
    dvd_struct s; 
    id=open("/dev/dvd",O_RDONLY); 
    ioctl(id,DVD_READ_STRUCT,&s); 
    printf("%d,%s,%s",s.bca.len,s.manufact.value,s.disckey.value); 
    close(id); 
} 

Прежде всего в изготовл и значения disckey появляются редкие символы, но это будет не так важно, если бы это было не потому, что в любое время я запустить программу появляется новое значение, несмотря на всегда сохраняя DVD в dvd-проигрывателе. Даже bca.len варьируется в каждом исполнении, хотя верно, что он всегда дает число выше 32000 и ниже 33000.

Наконец, результаты даются, есть ли вставленный dvd или нет, поэтому я задаюсь вопросом, где именно получается результат, даже если он читает dvd.

dvd распознается операционной системой, так как cat/dev/dvd отображает его содержание в прекрасном виде.

Может кто-нибудь объяснить, почему это работает таким образом, и если бы я мог заставить его работать appropiately (я имею в виду, получать те же результаты, по крайней мере, для изготовл и disckey значений и убедившись, что информация взята из вставленного DVD?

Спасибо за внимание.

+0

Я ничего не знаю об ioctl и как использовать thist struct, но это кажется полезным. http://www.tldp.org/LDP/lkmpg/2.4/html/x856.html – Chirality

ответ

1

Проверить возвращаемое значение ioctl. Если он терпит неудачу s не будет заполнена Infos.

if (ioctl(id, DVD_READ_STRUCT, &s) < 0) 
{ 
    perror("DVD_READ_STRUCT"); 
    return -1; 
} 

Man

RETURN VALUE 

     Usually, on success zero is returned. A few ioctl() requests use the 
     return value as an output parameter and return a nonnegative value on 
     success. On error, -1 is returned, and errno is set appropriately. 
ERRORS 

     EBADF fd is not a valid descriptor. 

     EFAULT argp references an inaccessible memory area. 

     EINVAL request or argp is not valid. 

     ENOTTY fd is not associated with a character special device. 

     ENOTTY The specified request does not apply to the kind of object 
       that the descriptor fd references. 

BTW всегда проверяет возвращаемые значения не пустоты.

+0

Почему голос? – LPs

1

Спасибо, за ваши советы, я должен решить с помощью кода, подобного этому, который вставляется перед вызовом IOCTL:

memset(&s, 0, sizeof(s)); 
s.type = DVD_STRUCT_MANUFACT; 

Вы должны установить тип для с и вы получите которые относятся к этому типу и делают то же самое для каждого типа.

+0

Полезно знать. +1 – LPs