문제

AIX 상자에 Perl 스크립트가 실행됩니다.

스크립트는 특정 디렉토리에서 파일을 열려고 시도하고 파일이 읽기 권한이 없기 때문에 파일을 읽지 못하지만 다른 오류가 발생합니다. inappropriate ioctl for device.

같은 말을해서는 안됩니다 no read permissions for file 아니면 비슷한 것?

이게 뭐야 inappropriate ioctl for device 메시지가 의미합니까?

어떻게 고칠 수 있습니까?

편집 : 이것은 내가했을 때 내가 찾은 것입니다. strace.

open("/local/logs/xxx/xxxxServer.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 
    0666) = 4 _llseek(4, 0, [77146], SEEK_END) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc14f8) = -1 ENOTTY 
    (Inappropriate ioctl for  device)
도움이 되었습니까?

해결책

아마도 그것은 열린 것을 의미합니다 실패하지 않았습니다.

Perl이 파일을 열면 파일이 tty인지 여부를 확인합니다 (따라서 대답 할 수 있습니다. -T $fh 발행하여 Filetest 연산자) TCGETS 그것에 대해 ioctl. 파일이 일반 파일이고 tty가 아닌 경우 ioctl이 실패하고 errno를 설정합니다. ENOTTY (문자열 값 : "장치의 부적절한 IOCTL"). Ysth가 말했듯이, 예상치 못한 가치를 보는 가장 일반적인 이유는 $! 유효하지 않을 때 확인하고 있습니다. 즉, 어디서나 다른 SYSCALL이 실패한 직후보다 즉시 작업의 결과 코드를 테스트하는 것이 매우 중요합니다.

만약에 open 실제로 당신을 위해 거짓을 반환했고 당신은 ENOTTY 안에 $! 그런 다음 나는 이것을 작은 버그라고 생각합니다 (쓸모없는 가치를 부여합니다. $!) 그러나 나는 또한 그것이 어떻게 일어 났는지에 대해 매우 궁금 할 것입니다. 코드 및/또는 트러스 출력은 다음과 같습니다.

다른 팁

"장치의 부적절한 IOCTL"과 같은 홀수 오류는 일반적으로 $를 확인한 결과입니다! 시스템 호출이 실패한 후에도 어느 시점에서. 코드를 보여 주면 누군가가 당신의 오류를 빠르게 지적 할 것입니다.

*Nix 유형 시스템의 "파일"은 매우 추상적 인 개념입니다.

파일 시스템으로 구성된 디스크 영역 일 수 있지만 네트워크 연결, 약간의 공유 메모리, 다른 프로세스의 버퍼 출력, 화면 또는 키보드 일 수 있습니다.

Perl이 실제로 유용하기 위해서는이 모델을 매우 밀접하게 반영하며 많은 4GL처럼 자기 테이프를 에뮬레이션하여 파일을 처리하지 않습니다.

따라서 해당 장치/파일에 대한 부적절한 IOCTL 작업 인 Writ

가장 쉬운 일은 고집하는 것입니다. or die 'Cannot open $myfile' 당신의 끝에서 진술을 열면 당신은 자신의 의미있는 메시지를 선택할 수 있습니다.

"장치의 부적절한 IOCTL"은 enotty 오류의 오류 문자열입니다. 예전에는 터미널 (예 : 일반 파일)이 아닌 파일 디스크립터에서 터미널 속성 (예 : Echo 모드)을 구성하려는 시도로 주로 트리거되었습니다. 보다 일반적으로, 해당 IOCTL을 지원하지 않는 장치에서 IOCTL을 수행 할 때 트리거됩니다. 따라서 오류 문자열입니다.

실패한 IOCTL이 무엇인지, 파일 디스크립터에 대해 Strace/Truss 아래에서 스크립트를 실행하십시오. Enotty를 인식하고 오류 메시지의 실제 인쇄가 이어집니다. 그런 다음 사용 된 파일 번호와 Open () 호출이 해당 파일 번호를 반환했는지 확인하십시오.

이 perl 버그를 수정했습니다. 보다 https://rt.perl.org/ticket/display.html?id=124232

버퍼 레이어를 Perlio로 밀고 실패한 ISATTY () 확인을 수행하면 모든 정상 파일에서 분명히 실패하면 잘못된 errno enotty를 무시하십시오.

유레카 순간!

나는 전에이 오류가 있었다.

Perl Debugger를 다음과 같이 호출 했습니까?

perl -d yourprog.pl > log.txt

그렇다면 Perl Debug는 쿼리를 시도하고 단자 너비를 재설정하려고 시도하는 것이 있습니다. STDOUT가 터미널이 아닌 경우 IOCTL 메시지로 실패합니다.

대안은 지침의 프롬프트를 보지 못했기 때문에 디버그 세션이 영원히 매달려있는 것입니다.

이것은 치명적인 오류이며 디버깅하기가 매우 어렵 기 때문에 수정 사항이 어딘가에 놓을 수 있습니다 (제공된 명령 줄에) :

export GPG_TTY=$(tty)

에서: https://github.com/keybase/keybase-issues/issues/2798

Centos 서버에서 공유로 장착 된 Windoze 7 상자에있는 폴더/파일을 삭제하기 위해 코드를 사용하려고 시도하면서 오늘이 오류가 발생했습니다. 장치 오류에 대한 부적절한 ICOTL을 얻었고 떠오르는 모든 것을 시도했습니다. 이와 관련된 인터넷의 모든 게시물을 읽으십시오.

분명히 문제는 Linux 서버의 장착 된 Windoze 공유로 격리되었습니다. Windoze 상자의 파일 권한을보고 파일에 권한이 읽을 수있는 권한이 있음을 언급했습니다.

그것들을 변경하고 Linux 서버로 돌아가서 모두 예상대로 작동했습니다. 이것은 대부분의 해결책이 아니지만 누군가를 어느 정도 절약 할 수 있기를 바랍니다.

작동하는 것처럼 보이는 다음 코드를 시도했습니다.

if(open(my $FILE, "<File.txt")) {
    while(<$FILE>){
    print "$_";}
} else {
    print "File could not be opened or did not exists\n";
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top