Um mesmo aplicativo pode se comportar de forma diferente dependendo da forma como é invocado. No exemplo a seguir, o mesmo programa é usado para calcular a raiz quadrada e potência de dois de um dado argumento.
#include <libgen.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { double res; char *program = basename(argv[0]); if (argc != 2) return 1; if (!strcmp(program, "sqrt")) { res = sqrt(atof(argv[1])); printf("%f\n", res); return 0; } if (!strcmp(program, "pow2")) { res = pow(atof(argv[1]), 2); printf("%f\n", res); return 0; } printf("Invalid program: %s\n", program); return 1; }
O truque consiste em analisar o primeiro argumento que corresponde ao caminho do binário do programa. No exemplo, decidimos qual ação tomar comparando o nome do programa com “sqrt” e “pow2”. Para não fazer múltiplas cópias do binário gerado, fazemos links simbólicos.
$ gcc -Wall -lm -o test test.c $ ln -s test sqrt $ ln -s test pow2 $ ./test 5 Invalid program: test $ ./pow2 5 25.000000 $ ./sqrt 5 2.236068
A técnica é extensamente utilizada no BusyBox e pode facilmente ser implementada em qualquer outra linguagem de programação.
Segue o exemplo em python:
#!/usr/bin/python
import sys
from os.path import basename
nome = basename(sys.argv[0])
numero1 = int(sys.argv[1])
numero2 = int(sys.argv[2])
if nome == ‘soma’:
print “Resultado da soma:”,numero1 + numero2
if nome == ‘subtracao’:
print “Resultado da subtracao:”,numero1 – numero2
————————-
No Windows não achei como fazer isto, por nao ter os links, mas deve ter como…
\o/
Não consigo ver a real utilidade.
Em um sistema embarcado que não suporta shared libraries é uma forma interessante de diminuir o footprint de uma aplicação.
Imagine 10 aplicações que fazem algo semelhante linkando estaticamente com a mesma biblioteca.
Aliás, busybox funciona exatamente assim, para aqueles que nunca olharam.
— Ulisses
Eu já havia feito algo parecido, porém nunca soube uma real utilidade para isso.