next up previous contents
Next: O pré-processador C Up: Programação C Previous: Interação com arquivos   Sumário

Rotinas para interação com o sistema operacional

Uma das formas de interação de um programa C com o sistema operacional é através da invocação da função system, também parte da biblioteca padrão:

    #include <stdlib.h>
    int system(const char *s);
O valor de retorno corresponde ao status de saída na execução do processo que executa o comando, sendo um valor distinto de 0 na ocorrência de problemas.

O exemplo abaixo ilustra o uso de system. Este exemplo é uma extensão do exemplo type anterior, onde além de apresentar o conteúdo do arquivo o programa também atualiza o atributo com a data do arquivo. Para atualizar este atributo, o comando touch do sistema operacional é utilizado. Este comando faz com que a data e hora associadas ao arquivo especificado como argumento sejam a data e hora correntes; se o arquivo especificado não existe, ele é criado com conteúdo vazio. Neste exemplo, se o arquivo não existe o programa encerra execução sem criar o arquivo, pois o comando touch é executado após a tentativa de abrir o arquivo com a função fopen.

    /*
     *   exemplo uso de system: leitura com atualizacao de data
     */
    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char *argv[]) {
      FILE *arq;
      int ch;
      char comando[60];

      /* testa se numero de argumentos correto */
      if (argc != 2) {
        printf("Uso: %s <nome arquivo>\n",argv[0]);
        return(1);
      }

      /* abre arquivo para leitura */
      arq = fopen(argv[1],"r");
      if (arq == 0) {
        perror(argv[1]);
        return(1);
      }

      /* atualiza data do arquivo */
      /*-- prepara comando */
      sprintf(comando, "touch %s", argv[1]);
      /*-- executa */
      system(comando);

      /* apresenta arquivo carater a carater */
      do {
        ch = getc(arq);
        putchar(ch);
      } while (ch != EOF);

      /* finalizacoes */
      fclose(arq);
      return(0);
    }

A outra forma de interação de um programa C com o sistema operacional é através da invocação de chamadas do sistema (system calls). O sistema operacional oferece um conjunto de serviços acessível através desta interface de rotinas que podem ser diretamente invocadas a partir de programas C.

Em geral, muito da funcionalidade das chamadas do sistema já está coberta em termos de rotinas equivalentes da biblioteca padrão. Por exemplo, é parte desta interface o conjunto de rotinas para manipulação de arquivos -- open, creat, close, read e write. Estas rotinas são acessadas pelas funções C da biblioteca padrão que suportam a funcionalidade de entrada e saída para terminais e arquivos.

As rotinas do conjunto de chamadas do sistema são em geral extremamente dependentes de cada sistema operacional. No contexto de Unix há um esforço de padronização deste nível de chamadas, que é o padrão POSIX 1003.1 (Portable Operating System -- o ``IX'' é uma referência não explícita a Unix). Entretanto, o padrão cobre aspectos básicos, sendo que há diversos grupos -- tais como OSF (Open Software Foundation, consórcio liderado por IBM, DEC e HP) e UI (Unix International, consórcio liderado pela AT&T) -- que buscam oferecer suas próprias extensões ao padrão, de forma que não há ainda uma interface única para todos os serviços providos por um sistema operacional.

Se portabilidade é importante para sua aplicação, o uso de chamadas do sistema deve ser evitado e, se realmente necessário, as chamadas utilizadas deveriam ser restritas ao conjunto POSIX.


next up previous contents
Next: O pré-processador C Up: Programação C Previous: Interação com arquivos   Sumário
Ivan L. M. Ricarte 2003-02-14