Quatro coisas interferem para determinar a permissão de um arquivo.
- Quando um aplicativo cria um arquivo, ele especifica um conjunto de permissões iniciais. Essas permissões iniciais são passadas como um argumento da chamada de sistema que cria o arquivo (
open
para arquivos regulares,mkdir
para diretórios, etc.). - As permissões são mascaradas com a umask , que é um atributo do processo em execução. O umask indica os bits de permissão que são removidos das permissões especificadas pelo aplicativo. Por exemplo, um umask de
022
remove a permissão de gravação em grupo e outra gravação. Um umask de007
deixa a permissão de gravação em grupo, mas torna o arquivo totalmente fora dos limites para outras pessoas. - As permissões podem ser modificadas por listas de controle de acesso . Eu não vou discutir mais sobre isso neste post.
- O aplicativo pode chamar
chmod
explicitamente para alterar as permissões para o que quiser. O usuário que possui um arquivo pode definir suas permissões livremente.
Algumas escolhas populares de conjuntos de permissões para a etapa 1 são:
- 666 (ou seja, leia e escreva para todos) para um arquivo regular.
- 600 (ou seja, ler e escrever somente para o proprietário) para um arquivo regular que deve permanecer privado (por exemplo, um email ou um arquivo temporário).
- 777 (por exemplo, ler, escrever e executar para todos) para um diretório ou para um arquivo regular executável.
É o umask que faz com que os arquivos não sejam legíveis para o mundo, apesar de os aplicativos poderem incluir a permissão de gravação de outros usuários nas permissões de criação de arquivos.
No caso do gcc, o arquivo de saída é criado primeiro com permissões 666 (mascarado pelo umask), depois chmod'ed para torná-lo executável. O Gcc poderia criar um executável diretamente, mas não: ele só torna o arquivo executável quando termina de escrevê-lo, para que você não corra o risco de começar a executar o programa enquanto estiver incompleto.