Как системный вызов umask() маскирует разрешение

Как системный вызов umask() маскирует разрешение

Я использую 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 — для неисполняемых.

Связанный контент