2011-01-09 6 views
8

저는 Linux C 프로젝트에서 작업 중이며 파일 설명자 작업에 문제가 있습니다.파일 설명 자에 대한 읽기/쓰기 권한 변경

쓰기 권한 만있는 고아 파일 설명자가 있습니다 (파일이 open()되었지만 unlink()되었지만 fd가 여전히 양호). 원본 백업 파일은 (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH로 생성 된) 전체 권한을 가졌지 만 파일이 O_WRONLY로 열렸습니다. 파일 기술자를 복제하고 사본을 O_RDWR로 변경할 수 있습니까?

psudo 코드 : 사전에


//open orphan file 
int fd = open(fname, O_WRONLY, ...) 
unlink(fname) 
//fd is still good, but I can't read from it 

//... 

//I want to be able to read from orphan file 
int fd2 = dup(fd) 
//----change fd2 to read/write???---- 

감사합니다! - 앤드류

+4

'fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_RDWR))'* 맨 페이지가 특별히 작동하지 않는다는 것을 제외하고는 그것과 같은 것처럼 보입니다. 커널이 불가능할 필요가있는 이유가 있습니다. – aschepler

+2

그럼 왜 그것을 읽으려고한다면 wronly 모드로 열어 보시겠습니까? –

+0

또는 올바른 플래그를 사용하여 다시 열면됩니다. – jweyrich

답변

6

아니요, 오픈 모드를 변경하는 POSIX 기능은 없습니다. 읽기/쓰기 모드로 열어야합니다. 임시 파일을 만들었으므로 mkstemp을 사용하는 것이 좋습니다. 이 함수는 파일을 읽기/쓰기 모드 으로 적절하게 열고의 링크를 해제합니다. 가장 중요한 점은 임시 파일 생성의 취약점을 피하면서 파일의 이름 지정 및 작성시 경쟁 조건을 피할 수 있다는 것입니다.

+2

mkstemp가 AFAIK의 연결을 해제하지 않습니까? –

+0

MK가 말한 바. open()에 O_EXCL을 항상 추가하고 실패시 다시 시도 할 수 있습니다. –