paulo1205
(usa Ubuntu)
Enviado em 16/06/2015 - 12:12h
Caro Thiago,
Já que você desencavou esse, deixe-me fazer uns comentários.
Thihup escreveu:
Gabrielz escreveu:
Não tenho Skype. É uma brincadeira ver o que a Microsoft faz com o Linux...
A respeito da minha dúvida, achei confusa sua explicação. Tem como dar uma explicação "alá faculdade"? -q
Hum... "Alá faculdade" complica pois nunca fui pra uma (ainda); Só tenho 14 anos!
Na verdade, a coisa é um pouco pior que isso. O autor da pergunta queria que alguém fizesse o trabalho de faculdade dele -- uma coisa que eu considero repugnante, e que em geral a comunidade não recebe muito bem.
Deixe-me ver ...
O argc (argument count) é um inteiro e possui o número de argumentos com os quais a função main() foi chamada na linha de comando. Ele é, no mínimo 1, pois o nome do programa é contado como sendo o primeiro argumento.
Falso. A única garantia sobre o valor de
argc é que ele não será negativo. De fato, você mesmo pode conseguir que ele seja zero. O código abaixo, que funciona em sistemas UNIX-like, faz isso.
char *empty_argv[]={NULL};
execv("/caminho/do/programa", empty_argv);
O argv (argument values) é um ponteiro para uma matriz de strings. Cada string desta matriz é um dos parâmetros da linha de comando. O argv[0] sempre aponta para o nome do programa (que, como já foi dito, é considerado o primeiro argumento). É para saber quantos elementos temos em argv que temos argc.
Quase tudo OK aqui. A ressalva é que
argc pode ser nulo e, nesse caso,
argv[0] não contém o nome do programa.
Existe ainda um outro caso excepcional; mas previsto no padrão e possível: se o nome do programa não puder ser determinado, mas
argc for maior do que zero,
argv[0] aponta para uma string vazia (i.e.
argv[0][0]==0). Isso seria possível de conseguir com o seguinte código, por exemplo.
/*
Chamo um programa que soma dois inteiros, mas não informo
ao programa seu próprio nome através do vetor de argumentos.
*/
char *some_argv[]={"", "1", "2", NULL};
execv("/caminho/do/somador", some_argv);
No entanto, a forma usual -- e mais educada -- de fazer seria mesmo informando o nome, de uma das formas abaixo (sendo que a segunda ainda é melhor que a primeira).
char progname[]="/caminho/do/programa";
char *some_argv[N_ARGS+2];
/*
Poderia tamber ser **some_argv, e depois
“some_argv=malloc((N_ARGS+2)*sizeof *some_argv)“
*/
some_argv[0]=progname;
some_argv[1]=arg_1;
some_argv[2]=arg_2;
/* ... */
some_argv[N_ARGS]=arg_n;
some_argv[N_ARGS+1]=NULL;
execv(progname, some_argv);
/*
Igual ao código acima, trocando apenas a atribuição de some_argv[0],
de modo a eliminar a informação de caminho, deixando apenas o nome
do programa.
*/
char *p=strrchr(progname, '/'); /* No Windows seria '\\' em lugar de '/'. */
some_argv[0]=(p? p+1: progname);