2008-08-27 5 views

답변

20

이 목적으로 mkstemp(3) 함수를 사용할 수 있습니다. 또 다른 대안은 tmpfile(3) 기능입니다. 어떤 파일을 선택할지는 파일을 C 라이브러리 파일 스트림 (tmpfile)으로 열 것인지 직접 파일 디스크립터 (mkstemp)로 열 것인지에 따라 다릅니다. tmpfile 기능은 프로그램을 끝내면 자동으로 파일을 삭제합니다.

이러한 기능을 사용하면 고유 한 파일 이름을 결정할 때와 파일을 만들 때 경쟁 조건이 발생하지 않으므로 두 프로그램이 같은 파일을 동시에 만들지 않도록 할 수 있습니다.

자세한 내용은 두 기능에 대한 설명서 페이지를 참조하십시오.

+0

은 mkstemp 단지에 열려있는 파일 기술자를 반환 새 파일이지만 mkstemp가 템플릿의 XXXXXX 문자를 대체하기 때문에 최종 이름을 얻을 수도 있습니다. – Angel

2

물론 : man mkstemp.

설명서 페이지에는 예제 사용법이 있습니다.

1

C lib에는 어떤 것이 있는지 잘 모르겠지만 쉘에서는 mktemp으로이 작업을 수행 할 수 있습니다.

3

@garethm :

난 당신이 찾고있는 기능이 tmpnam이라고 믿습니다.

당신은 확실히 하지 사용 tmpnam해야한다. 그것은 내 대답에서 언급 한 경쟁 조건 문제로 고통 : 이름을 결정하고 그것을 여는 사이에, 다른 프로그램이 파일이나 심볼릭 링크를 만들 수 있습니다. 이것은 거대한 보안 구멍입니다.

매뉴얼 페이지 tmpnam은 특별히 그것을 사용하지 말고 대신 mkstemp 또는 tmpfile을 사용한다고 말합니다.

5

질문은 임시 파일 의 이름을으로 생성하는 방법입니다. mkstemp 나 tmpfile은 호출자에게 이름을 제공하지 않으며, 파일 설명자 또는 파일 핸들을 각각 반환합니다.

+0

당신이 맞습니다, 마크, 질문은 임시 파일 이름을 묻습니다. 그러나 질문은 잘못되었습니다. 질문자는 임시 파일 이름을 정말로 원하지 않으며, 실제로 임시 파일을 원합니다. –

+1

그런 다음 질문을 변경해야합니다. –

+10

사실이 아닙니다 : mkstemp *는 주어진 템플릿을 수정하기 때문에 호출자에게 이름을 제공합니다. 호출자는 템플리트를 제공해야하지만 임시 디렉토리 (예 : $ TMPDIR, P_tmpdir 또는 "/ tmp")와 접두사, 여섯 개의 X를 선택하는 것은 비교적 간단합니다. –

0

이 권장되는 기능이기 때문에 당신은 때 mkstemp()를 사용합니다,하지만 당신은 설명이 일단 이름의 얻을 수 있도록이 파일 기술자를 반환

int fd; 
fd = mkstemp("hdrXXXXXX); 
/* Read out the link to our file descriptor. */ 
sprintf(path, "/proc/self/fd/%d", fd); 
memset(result, 0, sizeof(result)); 
readlink(path, result, sizeof(result)-1); 

/* Print the result. */ 
printf("%s\n", result); 
+0

이 [URL] (http://stackoverflow.com/help)를 확인하십시오. 콘텐츠 품질을 높이는 것이 유용 할 것입니다. –

관련 문제