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.