2017-02-08 1 views
1

임 (하지만 문제는 일반적인 파일을 주로)하고 다음 줄개방형 시스템 호출

fd = open(path,0); 

작업을하지만, 다음 줄에 실패있어 장치 파일을 열려고 난 그냥 그 작업을 대신 플래그의 공을 퍼 팅 이유의 의미가 무엇인지 이해 해달라고 (심지어 모드 0777없이)

fd = open(path,O_RDONLY,0777) 

.

답변

0

The POSIX specifications for open()이 필요로 정의 된 상수 O_EXEC, O_RDONLY는, O_WRONLY, O_RDWR, 또는 O_SEARCH이 플래그에 포함 할 수 있지만,이 값을이 상수의를 지정하지 않은 정확하게 하나. 사실 그들은 이론적 근거에서 "역사적인 구현에서 O_RDONLY 값은 0입니다." 이러한 구현에서 플래그를 0으로 지정하는 것은 O_RDONLY 만 지정하는 것과 같습니다.

POSIX의 "historical"용어 사용은 O_RDONLY의 값이 0 인 경우가 드물다고 제안해서는 안됩니다. 반대로 현재의 구현에서는 꽤 일반적입니다. 그럼에도 불구하고 O_RDONLY을 의미 할 때 플래그를 0으로 지정하면 플래그 상수의 정의가 다른 시스템에서 코드가 손상 될 수 있습니다.

플래그가 0으로 지정되었지만 플래그가 O_RDONLY (의심 스러울 수 있음)이 아닌 실제로 열 수있는 경우 O_RDONLY의 값은 구현시 0이 아닌 값이어야합니다. 그런 다음 필수 상수 그룹의 다른 멤버 중 하나가 값 0을 갖고 해당 모드에서 대상 파일을 열 수 있습니다 (예 : 경로가 디렉토리를 지정하고 값이 0 일인 O_SEARCH). 그렇지 않으면 정의되지 않은 동작이 open()에서 발생합니다. UB는 오류 표시기를 반환하는 것으로 나타낼 필요가 없으며 그렇게하지 않으면 발생하지 않으면 아무 것도 알려주지 않습니다.


부록은 : open(path, O_RDONLY), perror()를 통해 진단을 인쇄하여, 더 나은 errno, 또는를 검사하여 오류의 원인을 조사 할 가치가있을 것입니다 (-1 반환하여 표시) 당신을 위해 실패 주어진.