2015-01-30 3 views
2

Я создаю файл в C, используя следующий код:разрешения создания файла в C

int outfd = open(arg,O_CREAT|O_TRUNC|O_WRONLY, f_per); 

f_per является число разрешений файлов.

Установка f_per в 0644, выполнение кода и делающие Ls -l дает мне права доступа к файлам (выход), установленные в -rw-r--r--, который, как ожидается. Однако настройка вещей на 0777 дает разрешения как -rwxrwxr-x вместо -rwxrwxrwx. Любая идея, почему это происходит?

+2

Если вы на POSIX : 'umask'? – EOF

+1

Cf. http://unix.stackexchange.com/questions/93269/how-umask-system-call-is-masking-the-permission –

+0

Ах! Мне не хватало этого «unmask». Что все равно? (Не очень опытный с C) – Ranveer

ответ

1

Согласно POSIX page for the open call под O_CREAT:

... Разрешение доступа бит режима файла должен быть установлен на значение аргумента после Oflag аргумента, принятых в качестве типа mode_tс изменениями следует: побитовое И выполняется в битах файлового режима и соответствующих битах в дополнение к маске создания режима файла процесса.

Маска режима создания (или Umask) можно рассматривать как один субтрактивная. Например, если вы пытаетесь создать файл с правами rwxrwxrwx/0777, когда файл маска создания режим -------w-/0002, вы на самом деле в конечном итоге с:

rwxrwxrwx 
& rwxrwxr-x (complement of -------w-) 
    ========= 
    rwxrwxr-x 

Это, как представляется, ситуация вы столкнулись.

Если вы действительно хотите создать файл конкретных разрешений, вы можете временно отключить биты полномочий, установив его равным нулю (и восстановление его впоследствии), что-то вроде:

mode_t oldmask = umask(0); // needs sys/stat.h 
int outfd = open(arg, O_CREAT|O_TRUNC|O_WRONLY, 0777); 
umask(oldmask); 
Смежные вопросы