programing

open()이 잘못된 권한으로 파일을 만드는 이유는 무엇입니까?

randomtip 2022. 8. 10. 19:41
반응형

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을 읽다 보면,modeopen 파라미터:

모드는 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

반응형