다음과 같이 소스 코드에서 시스템 호출을 시도하고 있습니다.EINVAL을 반환하는 리눅스 오픈 콜의 가능한 이유
int file;
file = open(argv[index], O_RDONLY);
여기서 명령 줄 인수는 파일 시스템의 이진 파일 경로입니다. 그러나이 전화는 나를 EINVAL
오류가 발생시킵니다. 나는 파일의 존재와 그것에 접근하는 데 필요한 권한을 검사했다.
EINVAL
오류가 발생하는 상황에 대한 제안.
다음과 같이 소스 코드에서 시스템 호출을 시도하고 있습니다.EINVAL을 반환하는 리눅스 오픈 콜의 가능한 이유
int file;
file = open(argv[index], O_RDONLY);
여기서 명령 줄 인수는 파일 시스템의 이진 파일 경로입니다. 그러나이 전화는 나를 EINVAL
오류가 발생시킵니다. 나는 파일의 존재와 그것에 접근하는 데 필요한 권한을 검사했다.
EINVAL
오류가 발생하는 상황에 대한 제안.
원인 :
이 두 프로세스 말을했다 (프로세스 1, 프로세스 2) 가까운 속편에서 실행 된 그와 바이너리 파일을 열려고했다. 내 시스템 (임베디드 장치)이이 공개 호출 후에 충돌하기 때문에, 분할 된 디버그가 적절하지 않아 프로세스 1을 의심하게 만듭니다. 그러나 실제로는 O_RDWR
플래그로 바이너리를 여는 프로세스 2입니다. 하지만 내 파일 시스템 (네트워크 마운트)은 "읽기 전용 파일 시스템"으로 마운트되었습니다. 그것은 "오직 시스템 파일 읽기 "로 문제의 오른쪽 원인이 될해야 perror는 인쇄 정련
:
포인트 처리 될 수 있습니다. 그래서 내 초기 perror 설명은 이전의 잘못된 호출 중 하나라도 삭제되지 않은 값이어야합니다. 하나의 학습은 perror을 신중하게 사용하여 오도 된 오류 메시지를 분석하지 않도록하는 것입니다. EINVAL
오류가을 발생합니다
가능한 상황 : 우리가 사용되어 있지 않은 파일에 대한 O_SYNC (또는) 관련 플래그를 사용하는 경우 공모가 EINVAL
표시됩니다
. Rafe가 이전에 언급 한 문서를 기반으로 결론을 내립니다.
open()
구현시 열려는 파일에 대해 동기화 된 IO를 지원하지 않기 때문에 공식 문서에 나와있는 것과 같습니다. 당신이 argv[index]
실제로 파일 이름이 포함되어 있는지 확인하고 그 O_RDONLY
이 (O_RDONLY
0 같아야합니다) 어떻게 든 오버라이드 (override)되어 있지 않은 경우
의 dmesg
명령을 통해 시스템 로그를 확인하고 펑키 아무것도에서 커널 일어나지 않았는지 확인. 실패의
정확하게 이것을 어떻게 부르십니까? 다른 파일을 사용해 보셨습니까? 경고가 있습니까 ('-Wall')? –
Banthar에게 감사드립니다. 예. 다른 파일을 열어 보았습니다. 특정 바이너리 파일에 대해서만 오류가 표시됩니다. 나는 경고를 다시 확인해야한다. –
파일은 소켓이나 장치가 아닌 일반 이진 파일입니까? 어떤 종류의 파일 시스템입니까? 실제로 플래그가 O_RDONLY입니까? – Random832