2012-06-15 4 views
4

다음과 같이 소스 코드에서 시스템 호출을 시도하고 있습니다.EINVAL을 반환하는 리눅스 오픈 콜의 가능한 이유

int file; 
file = open(argv[index], O_RDONLY); 

여기서 명령 줄 인수는 파일 시스템의 이진 파일 경로입니다. 그러나이 전화는 나를 EINVAL 오류가 발생시킵니다. 나는 파일의 존재와 그것에 접근하는 데 필요한 권한을 검사했다.

EINVAL 오류가 발생하는 상황에 대한 제안.

+0

정확하게 이것을 어떻게 부르십니까? 다른 파일을 사용해 보셨습니까? 경고가 있습니까 ('-Wall')? –

+0

Banthar에게 감사드립니다. 예. 다른 파일을 열어 보았습니다. 특정 바이너리 파일에 대해서만 오류가 표시됩니다. 나는 경고를 다시 확인해야한다. –

+0

파일은 소켓이나 장치가 아닌 일반 이진 파일입니까? 어떤 종류의 파일 시스템입니까? 실제로 플래그가 O_RDONLY입니까? – Random832

답변

2

원인 :

이 두 프로세스 말을했다 (프로세스 1, 프로세스 2) 가까운 속편에서 실행 된 그와 바이너리 파일을 열려고했다. 내 시스템 (임베디드 장치)이이 공개 호출 후에 충돌하기 때문에, 분할 된 디버그가 적절하지 않아 프로세스 1을 의심하게 만듭니다. 그러나 실제로는 O_RDWR 플래그로 바이너리를 여는 프로세스 2입니다. 하지만 내 파일 시스템 (네트워크 마운트)은 "읽기 전용 파일 시스템"으로 마운트되었습니다. 그것은 "오직 시스템 파일 읽기 "로 문제의 오른쪽 원인이 될해야 perror는 인쇄 정련

:

포인트 처리 될 수 있습니다. 그래서 내 초기 perror 설명은 이전의 잘못된 호출 중 하나라도 삭제되지 않은 값이어야합니다. 하나의 학습은 perror을 신중하게 사용하여 오도 된 오류 메시지를 분석하지 않도록하는 것입니다. EINVAL 오류가을 발생합니다

가능한 상황 : 우리가 사용되어 있지 않은 파일에 대한 O_SYNC (또는) 관련 플래그를 사용하는 경우 공모가 EINVAL 표시됩니다

. Rafe가 이전에 언급 한 문서를 기반으로 결론을 내립니다.

1

open() 구현시 열려는 파일에 대해 동기화 된 IO를 지원하지 않기 때문에 공식 문서에 나와있는 것과 같습니다. 당신이 argv[index] 실제로 파일 이름이 포함되어 있는지 확인하고 그 O_RDONLY이 (O_RDONLY 0 같아야합니다) 어떻게 든 오버라이드 (override)되어 있지 않은 경우

1

dmesg 명령을 통해 시스템 로그를 확인하고 펑키 아무것도에서 커널 일어나지 않았는지 확인. 실패의

관련 문제