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 S
pouco e T
pouco? 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.