2014-12-20 6 views
1

내 프로그램USB를 언 마운트 통계 : 장치

mount("/dev/sda", "/media", "vfat", MS_NOATIME, NULL) 

를 사용하여 플래시 드라이브를 장착하고 사용하여 마운트 해제를 위해 나는 몇 가지 코드를 쓰고 있어요 부적절한 ioctl을

status = umount2("/media",MNT_DETACH); 
qDebug("USB unmount - status = %s\n", strerror(errno)); 

메시지는 말한다 : USB unmount - status = Inappropriate ioctl for device 때 사실 플래시가 성공적으로 마운트 해제되었습니다. 내가 여기서 뭐 잘못하고 있니?

대상 시스템은 데비안 내가 당신이보고있는 무엇 Qt는

+0

'status' 값은 무엇입니까? –

+0

어떤 언어입니까? 파이썬? – tripleee

+0

@MarkPlotnick 상태 값은 0입니다. http://linux.die.net/man/2/umount에 따르면 성공해야합니까? – Timtianyang

답변

1

와 C++를 사용하고 - 성공을 나타내는 시스템 호출 인터페이스 기능에서 제로 리턴하지만, 제로가 아닌 errno - 정상입니다. 이는 일반적으로 시스템 호출 인터페이스 함수와 몇 가지 다른 C 함수가 실패한 경우에만 errno을 설정하고 다른 경우에는 변경하지 않기 때문입니다. (엄밀히 말하면, 성공적인 함수 호출 후 errno의 값은 지정입니다.)

가 여기에 POSIX standard에서 인용입니다 : errno는의 값이 함수를 호출 한 후에 만 ​​정의되어야한다

명시 적으로 설정되고 다음 함수 호출로 변경되거나 응용 프로그램이 값을 지정할 때까지 명시 적으로 지정됩니다.

errno의 값은 함수의 반환 값에 의해 유효 할 때만 검사해야합니다.

함수를 성공적으로 호출 한 후 errno를 설정하면 해당 함수의 설명에서 errno가 수정되지 않아야한다고 지정하지 않는 한 지정되지 않습니다.

umount2에 대한 설명서를 보면 :

성공

, 0을 반환한다. 에러시 -1이 반환되고 errno가 적절하게 설정됩니다.

따라서 umount2에 대한 전화가 성공했으며 errno 값은 지정되지 않았습니다. 최근에 불려온 실패한 기능에 의해 errno이 설정되었을 가능성이 있습니다. 프로그램에서 strace을 실행하여 어떤 시스템 호출이 실패했는지 확인할 수 있습니다. 오류는 ioctl과 관련되어 있기 때문에이 함수는 stdout의 속성을 조사하는 stdio 인프라의 일부 였고 정상적으로 발생했습니다.

+0

좋은 전화. 반환 된 값을 먼저 확인한 다음 오류 메시지를 출력해야합니다. errno는 실제로 이전 함수 호출에 의해 설정되었습니다. – Timtianyang

관련 문제