2014-04-03 3 views
5

다음 코드를 발견했습니다.IOCTL 반환 값은

if((error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context))) 
{ 
     return EXIT_FAILURE; 
} 

내 질문 다음과 같습니다

  1. 합니까 IOCTL은 항상 반환 '0'성공?
  2. 다음 표현식은 양수/참값으로 어떻게 계산됩니까? 위의 표현의 ioctl의 0이 아닌 리턴 값을 true로 평가 않습니다 어떻게

    (error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context)) 
    

?

+2

1) 번호 읽기 : http://man7.org/linux/man-pages/man2/ioctl.2.html 2) 'ioctl'이 0과 다른 값을 반환하는 경우 "true"로 평가됩니다. – AntonH

+0

@AntonH 당신은 대답으로 게시해야합니다 :) –

+1

@JesusRamos 그래야하지만 짧은/빠른 대답이기 때문에, 나는 대답의 낭비라고 생각합니다. 나는 많은 평판을 잃는다 : D – AntonH

답변

6

이 문제를 처리하는 드라이버를 개발 한 개발자는 성공을 위해 어떤 값을 반환할지 결정합니다. ioctl 일반적으로 0은 모든 것이 올바르게되었다는 것을 의미합니다. 이 규칙은 오랫동안 UNIX 시스템에서 사용되었습니다.

어쨌든이 파일 디스크립터에 대한 문서를 읽고이 파일 디스크립터가 처리하는 특정 시스템 호출의 가치를 알아야합니다.

두 번째 질문에 대해서는 = 연산자가 할당 후 변수의 새 값을 반환합니다. 따라서 할당 연산자로 0이 아닌 값이 반환되면 표현식의 반환 값 (이 경우 ioctl의 경우 int)은 ~ true으로 암시 적으로 계산됩니다.

대부분의 경우 0이 아닌 음수 인 값은 잘못된 실행을 의미합니다. 경우에 따라 read 또는 write 시스템 호출과 같이 UNIX 시스템 호출은 양수 값을 반환합니다. readwrite 시스템 호출의 경우 양수 반환 값은 읽거나 쓴 바이트 수를 의미합니다.

ioctl이 반환 값이 양수이면 결과가 정상적으로 처리 될 수 있으며이 특정 파일 설명자가 나타내는 값의 상태 인을 반환 할 수 있습니다. 다시 한 번, 설명서를주의 깊게 읽으십시오.

그래서, 아래 코드 :

if (error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context)) { 
     return EXIT_FAILURE; 
} 

값이 0 true로 평가되고 우리는 코드의 조건부 블록을 입력합니다.