Por que alguns links simbólicos afetam o comportamento do programa?

6

Uma coisa que vem me intrigando há algum tempo é esta:

% which halt
/sbin/halt
% file /sbin/halt
/sbin/halt: symbolic link to 'reboot'

No entanto, a execução de sudo halt , é claro, não reinicializa o sistema. Por que isso?

Existem vários outros programas funcionando dessa maneira, por exemplo, pdflatex .

    
por Christoph Wurm 02.02.2011 / 11:52

1 resposta

12

Todo programa pode ver a linha de comando completa que foi usada para executá-lo (exceto por curingas e variáveis, que o shell expande).

Em um programa C, a linha de comando é armazenada em argv , que é a abreviação de vetor de argumento .
O nome do programa é o primeiro elemento de argv , ou seja, argv[0] .

Claramente, no caso de halt e reboot , o programa está alterando seu comportamento com base em argv[0] .

Do bash, você pode ver a linha de comando completa usada para executar um programa usando ps -p <pid> -o cmd ou cat /proc/<pid>/cmdline .

Observe que há outro tipo de link chamado hard link que terá o mesmo efeito. No meu sistema, por exemplo, sudo e sudoedit são o mesmo arquivo com dois nomes diferentes e comportamentos diferentes.

ls -i pode ajudar você a encontrar esses comandos, por exemplo:

$ ls -il | awk '$3 != 1 { print }'
total 156872
2491111 -rwsr-xr-x 2 root   root     127560 2011-01-20 05:03 sudo
2491111 -rwsr-xr-x 2 root   root     127560 2011-01-20 05:03 sudoedit

Veja man ln para mais detalhes sobre hard links se você não estiver familiarizado com eles.

    
por 02.02.2011 / 11:56