Почему действительно открывается (), создают мой файл с неправильными полномочиями?

Я пытаюсь прочитать некоторый текст из файла и записать это в другое использование 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 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;
}
46
задан JB. 15 September 2015 в 09:02
поделиться

2 ответа

open () принимает третий аргумент, который представляет собой набор разрешений, то есть

open(filename, O_RDWR|O_CREAT, 0666)

0666 - восьмеричное число, то есть каждая из 6 соответствует трем битам разрешений

6 = rw

7 = rwx

Это типичная ловушка. Компилятор позволяет вам не указывать аргумент разрешения, потому что, когда вы открываете существующий файл, биты разрешения не имеют смысла. Но когда вы забываете аргумент при создании файла, вы получаете случайный набор разрешений, например 0000 в вашем случае (---).

79
ответ дан 26 November 2019 в 20:19
поделиться

Читая http://linux.die.net/man/2/open , похоже, вы пропустили режим параметр для open:

режим должен быть указан, когда O_CREAT находится в флагах, и игнорируется в противном случае. Режим аргумента определяет разрешения для использования в случае создания нового файла.

9
ответ дан 26 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: