open()이 잘못된 권한으로 파일을 만드는 이유는 무엇입니까?
파일에서 텍스트를 읽고 다른 파일에 쓰려고 합니다.open()
,read()
그리고.write()
.
이건 내 거야open()
file-to-write-to(새 파일을 생성하여 파일에 씁니다)의 경우
fOut = open ("test-1", O_RDWR | O_CREAT | O_SYNC);
전혀 이해할 수 없는 파일 권한을 설정하고 있습니다.이것은 의 출력입니다.ls -l
:
---------T 1 chaitanya chaitanya 0 2010-02-11 09:38 test-1
읽기 권한도 잠겨 있습니다.이걸 찾아봤지만 아무것도 못 찾겠더라고요. 이상하게도write()
여전히 파일에 데이터를 쓸 수 있습니다.
또한 chmod 777 test-1을 실행하면 정상적으로 동작합니다.
제 오픈콜에서 어디가 잘못됐는지 누가 좀 알려주시겠어요?
감사합니다!
참고로 아래 프로그램 전체를 붙여넣었습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main () {
char buffer[512], ch;
int fIn, fOut, i;
ssize_t bytes;
FILE *fp = NULL;
//open a file
fIn = open ("test", O_RDONLY);
if (fIn == -1) {
printf("\nfailed to open file.");
return 1;
}
//read from file
bytes = read (fIn, buffer, sizeof(buffer));
//and close it
close (fIn);
printf("\nSuccessfully read %d bytes.\n", bytes);
//Create a new file
fOut = open ("test-1", O_RDWR | O_CREAT | O_SYNC);
printf("\nThese are the permissions for test-1\n");
fflush(stdout);
system("ls -l test-1");
//write to it and close it.
write (fOut, buffer, bytes);
close (fOut);
//write is somehow locking even the read permission to the file. Change it.
system("chmod 777 test-1");
fp = fopen ("test-1", "r");
if (fp == NULL) {
printf("\nCan't open test-1");
return 1;
}
while (1)
{
ch = fgetc(fp);
if (ch == EOF)
break;
printf("\n%c", ch);
}
fclose (fp);
return 0;
}
open()은 권한 세트인 세 번째 인수를 사용합니다.
open(filename, O_RDWR|O_CREAT, 0666)
0666은 8진수입니다.즉, 모든 6은 3개의 허가 비트에 대응합니다.
6 = rw
7 = rwx
소유자 권한에 대한 첫 번째 3비트, 그룹 권한에 대한 다음 3비트, 그리고 다음 3비트는 월드용 첫 번째 숫자입니다. 파일 또는 디렉토리를 나타냅니다. (0 - file , d - directory )여기서 사용한0은 파일을 의미합니다.
전형적인 함정이야컴파일러를 사용하면 기존 파일을 열 때 권한 비트가 의미가 없기 때문에 권한 인수를 그대로 둘 수 있습니다.단, 파일을 작성할 때 인수를 잊어버렸을 경우 랜덤한 권한 세트(예: 0000)를 얻을 수 있습니다.
http://linux.die.net/man/2/open을 읽다 보면,mode
open 파라미터:
모드는 O_CREATE가 플래그에 있을 때 지정해야 하며, 그렇지 않을 경우 무시됩니다.인수 모드에서는 새 파일이 생성되었을 때 사용할 권한을 지정합니다.
이것은 오래된 스레드입니다만, 「sys/stat」라고 하는 것을 알고 있을 필요가 있다고 생각합니다.h" 라이브러리여기에는 권한 비트를 설정하기 위한 심볼 상수 다발이 포함됩니다.
예를 들어 다음과 같습니다.사용자에 대해 읽기/쓰기 권한이 활성화된 파일을 열려면 다음과 같이 하십시오.
#include <fcntl.h>
#include <sys/stat.h>
open("Your/File/Path", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR);
여기서:
S_IWUSR // Sets the Users Write bit
S_IRUSR // Sets the Users Read bit
이 도서관에는 다른 것들이 많이 포함되어 있는데, 여기에 다 나열하지는 않겠지만 여기서 다 읽어보세요.
물론 이러한 비트를 설정하기 위해 8진수 값을 입력할 수 있지만 일부에서는 잘못된 코딩 관행이라고 주장할 수 있습니다.
★★★★★★★★★★★★★★★★★.umask()
사용 권한만 필터링하고 설정하지는 않습니다.인 「」입니다''umask()
는 「」입니다.0002
to 및 모드 이 ('write permission to give the world')인 ('write permission to the world')open( "file", O_CREAT, 0777)
에는 ""가 있습니다.775
그 결정체로서.
최근에 이 질문이 도움이 되었기 때문에, 저는 상황을 좀 더 깊게 하기 위해 제 역할을 하고 싶었습니다. 것처럼 세 .open()
다만, 표시되는 권한은 랜덤이 아니고, 스택으로부터 송신됩니다.이치노
asm("push $0");
asm("push $0");
asm("push $0");
fd = open("base", O_RDWR|O_CREAT);
다음의 결과에 주의해 주세요.
----------. 1 user user 4 Feb 26 08:21 base
첫 번째 푸시를 1로 변경합니다.즉, 실행 권한:
asm("push $1;push $0;push $0");
fd = open("base", O_RDWR|O_CREAT);
그 결과, 다음과 같이 됩니다.
---------x. 1 user user 4 Feb 26 08:25 base
푸시를 4(읽기 권한)로 변경하고 다른 두 값을 조작합니다.
asm("push $4;push $5;push $6");
fd = open("base", O_RDWR|O_CREAT);
그 결과, 다음과 같이 됩니다.
-------r--. 1 user user 4 Feb 26 08:27 base
따라서 스택에서 세 번째 값(처음 푸시된 값)이 실제로 중요한 것임을 알 수 있습니다.마지막으로 재미를 위해 5번과 50번을 시도하면 각각 다음과 같은 결과를 얻을 수 있습니다.
-------r-x. 1 user user 4 Feb 26 08:27 base
----rw----. 1 user user 4 Feb 26 08:28 base
이게 좀 더 명확해졌으면 좋겠어!
해서 '어느끼다'라고 불러도 요.umask(0);
전 open();
을 파일에합니다.system call은 system call 을 사용합니다.
질문에는 엄밀하게 관련되지 않지만, 받아들여진 답변은 다음과 같은 명확한 점을 사용할 수 있습니다.
rwx와 그 수치 표현 사이에는 문자의 존재는 이진수 1로, 존재하지 않는 것은 이진수 0으로 처리함으로써 알 수 있는 관계가 있습니다.
예.
rwx <--> 111 (binary) <--> 7 (octal)
r-- <--> 100 (binary) <--> 4 (octal)
-wx <--> 011 (binary) <--> 3 (octal)
추가 부록으로 chmod 명령어를 고려할 수 있습니다.
chmod 777 파일명확장 --> rwxrwxrwx 권한
777 <--> 111 111 111 <--> rwx rwx rwx
또는 chmod 654 파일 이름.확장 -->rw-r-x-r--
654 <--> 110 101 100 <--> rw- r-x r--
유익한 정보이길 바랍니다!
언급URL : https://stackoverflow.com/questions/2245193/why-does-open-create-my-file-with-the-wrong-permissions
'programing' 카테고리의 다른 글
C에 C++가 아닌 "struct" 키워드가 필요한 이유는 무엇입니까? (0) | 2022.08.10 |
---|---|
Vuex | 커밋 방식으로 전달할 수 있는 옵션은 무엇입니까? (0) | 2022.08.10 |
Vue JS 애플리케이션의 API에서 데이터를 가져오는 테스트 코드 (0) | 2022.07.21 |
여러 개의 C 프로그램을 컴파일하기 위해 파일을 만드시겠습니까? (0) | 2022.07.21 |
Java에서 올바른 마이크로벤치마크를 작성하려면 어떻게 해야 하나요? (0) | 2022.07.21 |