디렉토리 권한에 이상한 문제가 있습니다.
C++ 앱 내에서 다음을 사용하여 폴더를 만듭니다.
mkdir( "foldername", 777 );
그런데 해당 폴더에 파일을 만들려고 할 때 문제가 발생하여 을 fopen()
반환 NULL
하고 errno
나에게 말했습니다 Permission denied
. 그래서 확인해보니 생성된 폴더에 대해 다음과 같은 권한이 있었습니다.dr----x--t
(루트 폴더에는 drwxrwxr-x
)
확인해 보니 이 특이한 것은 t
"일시적"을 의미하지만 그것이 무엇을 의미하는지 전혀 알 수 없습니다.
chmod 777 foldername
쉘에서 작업을 수행하고 속성을 로 설정 drwxrwxrwx
하지만 매번 수동으로 수행할 수는 없습니다.
질문: 무슨 일이 일어나고 있는지에 대한 단서가 있나요? 내 앱이 폴더 속성을 올바르게 설정하지 않는 이유는 무엇입니까? 이 '임시' 속성의 의미는 무엇입니까?
(시스템은 Ubuntu 12.04입니다)
답변1
t
"일시적"이 아니며 고정 비트가 설정되었음을 의미합니다. 에서 man ls
:
t 고정 비트가 설정되어 있고(모드 1000) 검색 가능하거나 실행 가능하다는 것을 의미합니다. (chmod(1) 또는 끈적끈적(8)을 참조하십시오.)
당신이 설정했기 때문에 고정 비트가 여기에 설정되었습니다소수777(8진수 1411), 아님8진수777(십진수 511). 0777
가 아닌 8진수를 사용하려면 작성해야 합니다 777
.
mode
또한 인수 의 궁극적인 효과에는 mkdir
umask에 대한 ANDing도 포함된다는 점에 유의해야 합니다 . 에서 man 2 mkdir
:
인수 모드는 사용할 권한을 지정합니다. 일반적인 방법으로 프로세스의 umask에 의해 수정됩니다. 생성된 디렉터리의 권한은 (mode & ~umask & 0777)입니다.
이것이 당신에게 영향을 준다면, mode 인수를 사용하는 대신에 chmod
당신 에게 제안하고 싶습니다 .mkdir
마지막 경고: 모드 777이 거의 완료되었습니다.절대당신이 정말로 하고 싶은 일. 모든 사용자에게 전역적으로 디렉터리를 공개하는 대신 디렉터리에 적절한 모드와 소유자/그룹을 설정하는 것이 좋습니다. 더 복잡한 규칙이 필요한 경우 ACL 사용을 고려해보세요.
답변2
777
C의 경우 십진수입니다. 0777
8진수로 처리되도록 사용해야 합니다 .
답변3
모드에 10진수 대신 8진수를 사용하고 싶을 수도 있습니다.
mkdir( "foldername", 0777 );
둘째, 본인의 상태를 확인해야 합니다.우마스크이러한 권한으로 실제로 inode를 생성할 수 있는지 확인하기 위한 설정입니다.
참고자료:
답변4
다른 좋은 답변 외에도 폴더를 만들기 전에 설정할 수 있으므로 umask
원하는 000
올바른 권한을 가질 수 있습니다.
#include <stdio.h>
#include <sys/stat.h>
int main(void) {
mode_t old_umask;
old_umask = umask(0);
mkdir("tests", 0777);
umask(old_umask);
}
예:
$ g++ -Wall mkdir.cpp
$ ./a.out
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests
메모
8진 모드를 사용하는 대신 다음에서 POSIX 매크로를 사용할 수 있습니다 mkdir
.
mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);