현재 Linux 커널 용 모듈을 구축 중입니다. 내 작업 개정판은 3.8-rc3 +입니다. 내 작업으로 일부 ioctl()
명령을 구현하도록 유도했습니다. 알다시피, 내 명령은 적절한 오류 코드를 반환하여 실행 중에 무엇이 잘못되었는지 설명해야합니다. 이것은 매우 단순 해 보이지만 어떤 오류 코드를 반환해야 하는지를 알 수없는 유스 케이스가 있습니다.어떤 오류 값을 사용해야합니까?
기본적으로 사용자는 주어진 장치에 대해 암호화 키를 설정할 수 있어야합니다. 내 모듈은 장치 고유 식별자 (기본 int
)로 색인 된 R-B 트리에 키를 저장합니다. "대상"장치가 이미 트리에 항목이있는 경우이 항목을 업데이트해야합니다. 그렇지 않으면 모듈은 요청 된 암호화 키와 함께 해당 장치의 트리에 새로 할당 된 항목을 간단히 추가합니다. 모듈 내부
- 뭔가 사용자가 업데이트하고자하는 암호화 키를 사용 될 수 있습니다 : 모듈이
EBUSY
오류를 반환하는 키를 설정하는 동안, 상기 여러 가지가 발생할 수 있습니다. - 입력 및 할당에 실패했습니다.
ENOMEM
오류가 발생했습니다. - 모듈이 리소스를 해제하고 있습니다. 기존 키 입력이 삭제 표시 될 수 있습니다 (항목에
dying
깃발이 있음). 내부적으로 현재 발신자가 항목을 변경하는 동안 권한을 변경하지 않았으므로 오류 코드EPERM
을 사용합니다.
내가 말했듯이 후자의 경우에는 EPERM
오류 코드를 사용하지만 오류가 있으며 오류 코드를 사용해야한다는 것을 알지 못합니다. 어떤 조언을 환영합니다!
또한 사용자 공간 응용 프로그램에서 ioctl()
을 사용할 수있는 linux 태그를 지정했습니다.
편집는 :
- 모듈의 리소스를 해제하고,
ESHUTDOWN
가 반환됩니다 의견과 답변을 통해 읽은 후, 나는 이런 식으로 만들 것이라 생각합니다. - 트리의 나머지 부분은 여전히 정상이지만 대상 키만 파괴되는 경우
EACCES
이 사용됩니다.
당신은 아마, #DEFINE 중 하나를 사용할 수 있습니다 *이/ #DEFINE의 EFAULT 14/* 잘못된 주소 */ #DEFINE의 EBUSY 16/* 장치 또는 내가 할 수없는 바쁜 */ –
@KinjalPatel 자원 거부 (13)/* 권한을 EACCES 유스 케이스 1과 유스 케이스 3을 구별하려면'EBUSY'를 사용하십시오.'EFAULT'는 명령에 좋은 매개 변수가 제공되고 segfault가 예방되지 않았기 때문에 적절하지 않습니다. 'EACCES'는 그 트릭을 할 수는 있지만 초기 목적이 아니라는 느낌을 가지고 있습니다. 내가 맞습니까? – Rerito
예, 일반적으로 EACCES는 사용자 권한으로 사용됩니다. 하지만 귀하의 경우에는 그 것이 적절하다고 생각합니다. –