2017-05-12 4 views
0

부스트 용으로 이전 feature request이 부스트. 파일 시스템에서 mkstemp POSIX 기능과 유사한 기능을 요청하고있었습니다. 문제는 수정 된 상태로 고정되어 있으며 주석으로 닫힙니다.boost :: filesystem :: unique_path()는 C++에서 mkstemp analogue의 필요성을 어떻게 해결합니까?

버전 3의 unique_path() 함수는 문제를 해결합니다.

그러나 unique_path이 문제를 어떻게 해결하는지 알 수 없습니다. 기본적으로 tmpnam과 같습니다. 이름이 생성 된 후 실제 파일이 작성되기 전에 다른 프로그램이 동일한 이름의 파일을 작성했을 수 있습니다.

그러면 어떻게해야 mkstemp의 필요성을 해결할 수 있습니까?

+0

어떤 파일 이름을 선택하든 다른 프로그램에서 이미 사용하고있을 수 있습니다. 그러나 합리적으로 고유 한 파일 경로를 생성하는 것이 거의 불가능하므로 이러한 충돌은 거의 발생하지 않습니다. – VTT

+0

여전히 'unique_path'는 C++ 17에서 거부 될 보안 취약성으로 충분히 간주됩니다 (https://wg21.cmeerw.net/lwg/issue2633). – Ruslan

답변

0

내 생각 엔 (적어도 * nix에서 스크립트 시스템) 구현을 효과적으로 기본적으로이 이미 존재하는 경우 오류를 반환 파일을 만듭니다 "라고 O_EXCL | O_CREATopen를 호출을 초래할 수 있다는 점이다. 그래서

, ..

for(;;) { 
    name = create_likley_unique_name(); 
    file = open(name, O_EXCL | O_CREAT, mode); 
    if(valid(file)) { 
     return file; 
    } 
} 

이 물론 단지 추측입니다,하지만 난 창 또는 OSX는 비교 플래그가 있다면 그것은 내가 아무 생각이 합리적인 일이 없다 생각

: 구현이 같은 알고리즘을 가질 수

제안 수정 (1) 기능을 이름을 변경하고 (2) 기능을 사용하는 방법에 대한 예를 제공하는 것입니다 : 당신이 링크 된 페이지의 "솔루션"의 핵심 부분은이 부분을 생각 fstreams 또는 심지어 CI/O를 사용하여 안전하게. 제안 된 문구는 아래를 참조하십시오.

여기서 적절한 예제는 방금 쓴 것과 비슷하지만 해당하는 C++ ish API를 사용합니다.

스레드에서이 함수의 이름을 generate_random_filename()으로 바꾸는 것이 좋습니다. 이는 예측할 수 없지만 고유성이 보장되지 않았기 때문에 더 적절합니다. 또한 create_unique_file()을 제안하십시오. 이는 내 예제와 비슷한 알고리즘을 구현할 가능성이 높습니다.

+0

'O_EXCL'와 비슷한 동작을 얻는 유일한 방법은 C11에서 가능합니다 (따라서 C++ 17 이전의 C++에서는 사용 가능하지 않습니다) :'fopen (testFileName, "w + x")'. 기능 요청이 종료 된지 7 년 전만해도 실제로 사용할 수 없거나 생각할 수 없었습니다. – Ruslan

+0

그래,이 기능을 구현하려면 비표준 시스템 특정 코드를 사용해야한다고 생각합니다. 표준 lib 인 경우에 허용되는 것은. –

관련 문제