Como a chamada do sistema umask() está mascarando a permissão

Como a chamada do sistema umask() está mascarando a permissão

Estou usando umask()uma chamada do sistema para definir a permissão do arquivo. Estou usando o seguinte código :

umask(S_IWGRP | S_IWOTH);
printf("Enter file name that you want to create:");
scanf(" %s",file);
fd = open(file,O_CREAT|O_WRONLY);

Mas depois de executá-lo, o arquivo é criado com as permissões fornecidas abaixo

--wS-----T 1 rvi rvi     0 Oct  2 15:20 test.txt

Para que serve esse Spouco e Tpouco? e por que ele é modificado automaticamente?

Responder1

Quando você chama open com O_CREAT, ele espera um terceiro argumento para o modo do arquivo. O umask é então mascarado do modo solicitado. Então, por exemplo:

umask(S_IWGRP | S_IWOTH /* == 0022 */);
fd = open(file, O_CREAT|O_WRONLY, 0777);

criaria um arquivo com sinalizadores 0777 & (~0022) = 0755, ou seja, rwxr-xr-x, enquanto:

umask(S_IWGRP | S_IWOTH);
fd = open(file, O_CREAT|O_WRONLY, 0666);

criaria um arquivo com sinalizadores 0666 & (~0022) = 0644, ou seja, rw-r--r--. No seu caso, como você não forneceu um argumento de modo, a função open retira dados aleatórios da pilha, então a única coisa que você sabe é que os bits mascarados com umask estarão desativados. Tente fornecer o modo desejado para a chamada aberta; 0777 é uma boa escolha para arquivos executáveis ​​e 0666 é uma boa opção para não executáveis.

informação relacionada