O ID do usuário real identifica em qualquer caso o usuário executando o processo.
O ID de usuário efetivo é utilizado para determinar as permissões do processo. Estes dois valores são em geral iguais. Através da mudança do ID de usuário efetivo, um processo poderá ganhar permissões associadas ao novo ID do usuário (e perder temporariamente àquelas associadas ao identificador do usuário real).
Exemplo:
/* arquivo test_acces.c */ #include <errno.h> #include <stdio.h> #include <stdlib.h> /* primitiva system */ int main() { FILE *fp ; system("echo Meu login e: $LOGNAME"); printf("Vou tentar abrir o arquivo /home/saibel/teste\n"); if((fp=fopen("/home/saibel/teste","w")) == NULL ) perror("Error fopen()"); else printf ("O arquivo teste esta aberto\n"); printf("Vou tentar abrir o arquivo /home/adelardo/teste\n"); if((fp=fopen("/home/adelardo/teste","w")) == NULL ) perror("Error fopen()"); else printf ("O arquivo teste esta aberto\n"); exit(0); }
O programa test_s anterior é modificado agora pela adição de comandos para a abertura de um arquivo pertencente a usertest. O bit s é colocado em 1 para test_acces.
euler:~> ls -l test_acces -rwsr-xr-x 1 saibel prof 12521 Sep 25 10:59 test_acces* euler:~> ls -l /home/saibel/teste -rw-rw-r-- 1 saibel prof 0 Sep 25 10:59 /home/saibel/teste lyapunov:~> ls -l /home/usertest/teste -rw-rw-r-- 1 usertest prof 0 Sep 25 10:30 /home/usertest/teste
Agora, saibel lança o programa test_acces. Pode ser observado que ele tem o acesso ao arquivo teste que lhe pertence, mas não ao arquivo de usertest.
euler:~> test_acces Meu login e: saibel Vou tentar abrir o arquivo /home/saibel/teste O arquivo teste esta aberto Vou tentar abrir o arquivo /home/usertest/teste Error fopen(): Permission denied euler:~>
Do seu lado, usertest lança test_acces e obtém os direitos de acesso sobre o arquivo teste pertencendo a saibel, mas ele perde os direitos de acesso sobre seu próprio arquivo teste:
lyapunov:~> test_acces Meu login e: usertest Vou tentar abrir o arquivo /home/saibel/teste O arquivo teste esta aberto Vou tentar abrir o arquivo /home/usertest/teste Error fopen(): Permission denied lyapunov:~>