2016-03-19 1 views
3

Мой код выглядит следующим образом:«создающих» функция дает неправильные разрешения

#include "unistd.h" 
#include <fcntl.h> 

#define BSIZE 50 

int main(int argc, char *argv[]) { 
    int f1, f2; 
    char buf[BSIZE]; 

    f1 = open(argv[1], 0x0001, 0); 
    f2 = creat(argv[2], 0777); 

    read(f1, buf, BSIZE); 
    write(f2, buf, BSIZE); 

    return 0; 
} 

Когда я создаю файл с именем «а» и использовать скомпилированную программу с командой

./a.out a b 

создает файл с содержанием «а». Но моя проблема в том, что ее разрешения равны -rwxr-xr-x. Он не дает права на запись для группы и других. Более того, когда я меняю функцию на creat(argv[2], 0022); , тогда разрешение станет все 0 с ----------.

Есть ли что-то неправильное с функцией creat? Потому что chmod отлично работает.

ответ

2

создания файла использует два комбинированных права доступа:

  1. одной вы предоставили через creat или open
  2. и маски процесс, известный как umask

umask дает некоторый окончательный контроль пользователю вашей программы, маскируя некоторые биты, чтобы защитить созданные файлы, имеющие неожиданные обращения. В общем случае umask равно 022 означает, что доступ для записи удаляется для группы и других лиц, то есть пользователи не хотят больше, чем rwxr-xr-x.

После этого, когда вы возвращаете 0777, оно замаскировано (и) с ~umask здесь 0755, давая 0755. Код ошибки: При возвращении 022 - замаскирован и участвует 0755, указанным 000.

+0

Ваше объяснение «umask» удовлетворило мой вопрос очень хорошо. Спасибо. –

1

Файлы, созданные open, creat, fopen и т. Д., Биты режима получения маскируются по умолчанию umask. Вероятно, у вас есть umask022, который является непринужденным значением по умолчанию. Изменение umask на 0 было бы очень рискованным. Правильный подход заключается в том, чтобы явно использовать chmod, чтобы переопределить это значение по умолчанию и сделать файл доступным для записи членами группы и другими.