A função main

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:

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

Exercícios