Я использую umask()
системный вызов для установки разрешения файла. Я использую следующий код:
umask(S_IWGRP | S_IWOTH);
printf("Enter file name that you want to create:");
scanf(" %s",file);
fd = open(file,O_CREAT|O_WRONLY);
Но после его выполнения файл создается с указанными ниже разрешениями
--wS-----T 1 rvi rvi 0 Oct 2 15:20 test.txt
Для чего нужен этот S
бит T
и почему он изменяется автоматически?
решение1
Когда вы вызываете open с O_CREAT, он ожидает третий аргумент для режима файла. Затем umask маскируется из запрошенного вами режима. Например:
umask(S_IWGRP | S_IWOTH /* == 0022 */);
fd = open(file, O_CREAT|O_WRONLY, 0777);
создаст файл с флагами 0777 & (~0022) = 0755, т.е. rwxr-xr-x, тогда как:
umask(S_IWGRP | S_IWOTH);
fd = open(file, O_CREAT|O_WRONLY, 0666);
создаст файл с флагами 0666 & (~0022) = 0644, т. е. rw-r--r--. В вашем случае, поскольку вы не указали аргумент режима, функция open берет случайные данные из стека, поэтому единственное, что вы знаете, это то, что биты, замаскированные с помощью umask, будут отключены. Попробуйте указать нужный режим для вызова open; 0777 — хороший выбор для исполняемых файлов, а 0666 — для неисполняемых.