2013-03-05 3 views
10

현재 Linux 커널 용 모듈을 구축 중입니다. 내 작업 개정판은 3.8-rc3 +입니다. 내 작업으로 일부 ioctl() 명령을 구현하도록 유도했습니다. 알다시피, 내 명령은 적절한 오류 코드를 반환하여 실행 중에 무엇이 잘못되었는지 설명해야합니다. 이것은 매우 단순 해 보이지만 어떤 오류 코드를 반환해야 하는지를 알 수없는 유스 케이스가 있습니다.어떤 오류 값을 사용해야합니까?

기본적으로 사용자는 주어진 장치에 대해 암호화 키를 설정할 수 있어야합니다. 내 모듈은 장치 고유 식별자 (기본 int)로 색인 된 R-B 트리에 키를 저장합니다. "대상"장치가 이미 트리에 항목이있는 경우이 항목을 업데이트해야합니다. 그렇지 않으면 모듈은 요청 된 암호화 키와 함께 해당 장치의 트리에 새로 할당 된 항목을 간단히 추가합니다. 모듈 내부

  • 뭔가 사용자가 업데이트하고자하는 암호화 키를 사용 될 수 있습니다 : 모듈이 EBUSY 오류를 반환하는 키를 설정하는 동안, 상기 여러 가지가 발생할 수 있습니다.
  • 입력 및 할당에 실패했습니다. ENOMEM 오류가 발생했습니다.
  • 모듈이 리소스를 해제하고 있습니다. 기존 키 입력이 삭제 표시 될 수 있습니다 (항목에 dying 깃발이 있음). 내부적으로 현재 발신자가 항목을 변경하는 동안 권한을 변경하지 않았으므로 오류 코드 EPERM을 사용합니다.

내가 말했듯이 후자의 경우에는 EPERM 오류 코드를 사용하지만 오류가 있으며 오류 코드를 사용해야한다는 것을 알지 못합니다. 어떤 조언을 환영합니다!

또한 사용자 공간 응용 프로그램에서 ioctl()을 사용할 수있는 linux 태그를 지정했습니다.

편집는 :

  • 모듈의 리소스를 해제하고, ESHUTDOWN가 반환됩니다 의견과 답변을 통해 읽은 후, 나는 이런 식으로 만들 것이라 생각합니다.
  • 트리의 나머지 부분은 여전히 ​​정상이지만 대상 키만 파괴되는 경우 EACCES이 사용됩니다.
+0

당신은 아마, #DEFINE 중 하나를 사용할 수 있습니다 *이/ #DEFINE의 EFAULT 14/* 잘못된 주소 */ #DEFINE의 EBUSY 16/* 장치 또는 내가 할 수없는 바쁜 */ –

+0

@KinjalPatel 자원 거부 (13)/* 권한을 EACCES 유스 케이스 1과 유스 케이스 3을 구별하려면'EBUSY'를 사용하십시오.'EFAULT'는 명령에 좋은 매개 변수가 제공되고 segfault가 예방되지 않았기 때문에 적절하지 않습니다. 'EACCES'는 그 트릭을 할 수는 있지만 초기 목적이 아니라는 느낌을 가지고 있습니다. 내가 맞습니까? – Rerito

+0

예, 일반적으로 EACCES는 사용자 권한으로 사용됩니다. 하지만 귀하의 경우에는 그 것이 적절하다고 생각합니다. –

답변

3

어때 대략 ESHUTDOWN? (전송 끝점 종료 후 보낼 수 없음)

또 다른 옵션은 ENXIO (해당 장치 또는 주소 없음)입니다. 기기가 여전히 존재하기 때문에 100 % 정확하지는 않지만 오류의 의미를 전달합니다 (더 이상 사용할 수 없음).

간단한 선택은 ENOTSUP 것 (조작은 지원되지 않음)하지만 더

EPERM 더 나은 소리를하지만 일반적으로 "당신이 할 수있는 권한/권한이 없습니다"로 사용되는 "구현되지 방법"같은 소리 "지금 당장이 일을 할 수 없어요"대신에

ESTALE (오래된 파일 핸들)은 좋지만 NFS와 관련이 있습니다.

+0

나는 'ESHUTDOWN'을 놓쳤다. 묘사가 나에게 오도 된 것처럼 보일지라도 그것은 매우 명백하다. 어쨌든, 이것이 가장 좋은 해결책이라고 생각합니다. 그 점을 지적 해 주셔서 감사합니다. – Rerito

관련 문제