2013-09-20 2 views
0

У меня есть следующая простая программа:Почему O_CREAT создает файлы, доступные только администраторам?

#include <iostream> 
#include <fcntl.h> 
#include <unistd.h> 
#include <string> 

using namespace std; 

int main() { 
    string data { "The quick brown fox jumps over the lazy dog" }; 

    int file_descriptor = open("some_file.txt", O_CREAT | O_WRONLY); 
    write(file_descriptor, data.c_str(), data.size()); 

    cout << file_descriptor << endl; 
    return 0; 
} 

, которые по большей части работает отлично - данные выводятся в файл. Но за http://linux.die.net/man/2/open флаг O_CREAT должен установить владельца файла на эффективный идентификатор пользователя процесса. Я компилирую/запускаю свое приложение с терминала, но не с помощью каких-либо привилегий, поэтому почему созданный файл доступен только для администраторов?

ответ

10

Random mischance. Когда вы используете O_CREAT, open() - это функция с тремя аргументами, которая принимает файловый режим в качестве третьего аргумента.

Вы должны использовать:

int fd = open("some_file.txt", O_CREATE | O_WRONLY, 0444); 

Это создаст файл без каких-либо разрешений на запись для всех (но которые ваш процесс будет иметь возможность писать).

См. <sys/stat.h> для получения дополнительной информации о символических константах POSIX для использования вместо 0444.

+1

Хороший звонок. Моя первая мысль заключалась в том, что ['umask (2)'] (http://linux.die.net/man/2/umask) настроен на какое-то странное значение, но это, безусловно, правильное объяснение. –

+0

@sircodesalot: 0444 действительно S_IRUSR | S_IRGRP | S_IROTH. R для чтения (W для записи, X для выполнения). Я просто использовал; Я не знаю, почему он был там, но он был частью '' перед тем, как были изобретены мнемоники S_I [RWX] {USR, GRP, OTH}. Я изучил восьмеричные коды æons ago - и они более кратки, чем обозначения S_I *. –

+0

Удивительный, спасибо за такую ​​помощь. – sircodesalot

Смежные вопросы