A função main é o local de início (entry point) da execução de um programa em C. Apesar de termos usado até o momento essa função sem parâmetros, ela possui alguns parâmetros que permitem a comunicação entre o programa em C a shell, através do sistema operacional.
O protótipo da função main depende do sistema operacional subjacente:
// padrão C ANSI
int main (void) ;
int main (int argc, char **argv) ;
int main (int argc, char *argv[] );
// sistemas UNIX-like (Linux, FreeBSD, Solaris, ...) e Windows
int main (int argc, char **argv, char **envp) ;
// sistemas Apple (MacOS, iOS, ...)
int main (int argc, char **argv, char **envp, char **apple) ;
Significado dos parâmetros usuais:
''argc'': número de parâmetros na linha de comando que lançou a execução;
''argv'': vetor de strings (''char *'') que contém os argumentos de linha de comando, finalizado por um ponteiro nulo;
''envp'': vetor de strings (''char *'') na forma "nome=valor" que contém as variáveis de ambiente do shell que lançou a execução do programa (também finalizado por um ponteiro nulo);
Para ver o ambiente de execução da sua shell diga: env
Alguns dos pares no ambiente podem ser familiares, tais como TZ (time zone), USER, PWD (print working directory = diretório corrente), HOME, SHELL, MANPATH, LOGNAME.
Para descobrir o valor de uma variável diga echo $TZ Note o $ prefixando o nome.
O programa abaixo imprime na tela os argumentos usados no lançamento do programa.
#include <stdio.h>
int main (int argc, char **argv, char **envp)
{
int i ;
printf ("Numero de parâmetros: %d\n", argc) ;
for (i=0; i<argc; i++)
printf ("argv[%d]: %s\n", i, argv[i]) ;
return (0) ;
}
A compilação e execução do código acima produzem
$ gcc argv.c -o argv -Wall
$ ./argv teste 1 2 3 --help
Numero de parâmetros: 6
argv[0]: ./argv
argv[1]: teste
argv[2]: 1
argv[3]: 2
argv[4]: 3
argv[5]: --help
Repare que argv[0] é o nome do próprio executável. Por que essa informação seria útil?
Para ler e tratar mais facilmente as opções da linha de comando informadas por argc/argv, sugere-se usar funções prontas, como ''getopt'' ou ''arg_parse''. (Veja aqui).
Outro canal de interação importante entre o programa C e o sistema operacional é o valor de retorno da função main, que é devolvido ao SO após a execução na forma de status de encerramento (exit status).
#include <stdio.h>
int main (int argc, char **argv, char **envp)
{
return (14) ;
}
O status de encerramento de um processo pode ser consultado pela shell (Bash) através da variavel ''$?'':
$ gcc retval.c -o retval -Wall $ ./retval $ echo $? 14