Вопрос по file-permissions, c, unix, linux – Как я могу скопировать разрешения из файла, который уже существует?

2

Я должен написать программу на C (в Unix-подобной системе), и это моя проблема:

У меня есть файл (FILE1), и я хочу создать другой файл (FILE2), который имеет те же разрешения FILE1. Затем я должен создать другой файл (FILE3), который имеет те же права доступа FILE1, но только для владельца.

Я бы использовал chmod (), чтобы изменить разрешения, но я неНе понимаю, как получить разрешения FILE1.

Не могли бы вы мне помочь?

Также прочитайтеadvancedlinuxprogramming.com Basile Starynkevitch

Ваш Ответ

3   ответа
7

stat() а такжеfstat() функции получитьstruct stat, который включает в себя членst_mode с указанием режима файла, в котором хранятся разрешения.

Вы можете передать это значениеchmod() или жеfchmod() после маскировки битов без разрешения доступа к файлу:

struct stat st;

if (stat(file1, &st))
{
    perror("stat");
} 
else
{
    if (chmod(file2, st.st_mode & 07777))
    {
        perror("chmod");
    }
}
2

использованиеstat(2) системный вызов.

int stat(const char *path, struct stat *buf);

struct stat {
    ....
    mode_t    st_mode;    /* protection */
    ....
};

Используйте следующие флаги с.st_mode

S_IRWXU    00700     mask for file owner permissions
S_IRUSR    00400     owner has read permission
S_IWUSR    00200     owner has write permission
S_IXUSR    00100     owner has execute permission

S_IRWXG    00070     mask for group permissions
S_IRGRP    00040     group has read permission
S_IWGRP    00020     group has write permission
S_IXGRP    00010     group has execute permission

S_IRWXO    00007     mask for permissions for others (not in group)
S_IROTH    00004     others have read permission
S_IWOTH    00002     others have write permission
S_IXOTH    00001     others have execute permission
1

Этот ответ после двух других. Поэтому я дам вам только код.

#include 
#include 
int main()
{
     struct stat buffer;
     mode_t file1_mode;
     if(stat("YourFile1_PathName",&buffer) != 0)//we get all information about file1
     {printf("stat error!\n"); return -1;}
     file1_mode = buffer.st_mode;//now we get the permissions of file1
     umask(file1_mode^0x0777);//we set the permissions of file1 to this program.then all file create by this program have the same permissions as file1
     // ....do what you want  below     

}
@caf Моя ошибка. Извините. Lidong Guo
Это неверно, значение переданоumask это разрешения, которыене установить в файлах, созданныхopen() с .O_CREAT caf

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