Mostrando postagens com marcador c. Mostrar todas as postagens
Mostrando postagens com marcador c. Mostrar todas as postagens

segunda-feira, 22 de julho de 2013

Linux - Tratamento de Exit Status / Return Code

O bash guarda a informação a respeito da execução de um programa na variável de ambiente $? logo após a execução da mesma. Avaliando o conteúdo da mesma é possível verificar se uma determinada execução terminou com sucesso ou não.

Exemplo:

somecommand  argument1 argument2
RETVAL=$?
[ $RETVAL -eq 0 ] && echo Success
[ $RETVAL -ne 0 ] && echo Failure

sexta-feira, 14 de junho de 2013

Programa C - Compilação de Programas via prompt

Para compilar programas 'C' em distribuições Fedora/CentOs (ou outras) usando o compilador/linkeditor gcc (GNU Compiler Collection, http://gcc.gnu.org/) utilizar, preferencialmente, a seguinte sintaxe:

gcc -Wall -o <executavel> <fonte.c>

Exemplo:

gcc -Wall -o teste teste.c

Caso o programa use a biblioteca Math.h, incluir o parâmetro -lm para linkeditar com esta biblioteca:

gcc -Wall -lm -o <executavel> <fonte.c>

Exemplo:

gcc -Wall -lm -o teste teste.c

Outros parâmetros comuns:
-c : Apenas compila o programa, mas não faz a linkedição. Para linkeditar então deve-se chamar novamente o gcc, passando com a seguinte sintaxe:
gcc -o <executavel> <objeto>

exemplo:
1) Compilação
gcc -c -o teste.o teste.c

2) Linkedição
gcc -o teste teste.o

-glevel (normalmente -g3): Inclui informação completa de Debug, para uso com o GDB (GNU Debugger (http://www.gnu.org/software/gdb/)




Programa C - Utilização da Biblioteca Math

Em distribuições Fedora/CentOs, quando se quer utilizar a biblioteca MATH (math.h / libm) em programas "C", por algum motivo o linkeditor normalmente não encontra esta biblioteca por default. Neste caso, é necessário informar ao compilador no momento da compilação para utilizá-la:

gcc -o <executavel> -lm <fonte>

Exemplo:

gcc -o teste -lm teste.c

Quando usando a IDE do Eclipse, deve-se entrar nas propriedades do projeto (ALT-ENTER), ir na opção C/C++ Build, seção Settings, GCC C Linker, Libraries, incluir a Library (-l) m.


segunda-feira, 13 de maio de 2013

C - Suporte a Arquivos com mais de 4Gbytes

Quando se utiliza programas "C", compilados com GCC,  para leitura de arquivos com mais de 4 Gigabytes deve-se utilizar os parâmetros :

-D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64


segunda-feira, 29 de abril de 2013

"C" - Conexão MySQL

Pré-requisitos
mysql (client)
mysql-devel

A compilação de programas com acesso a bibliotecas do MySQL necessitam de alguns parâmetros especiais. Estes parâmetros podem ser obtidos através da execução do script 'mysql_config' que faz parte do pacote mysql-devel. Para compilar o programa, usar a seguinte sintaxe:
gcc -o <output> $(mysql_config --cflags) <fonte.c> $(mysql_config --libs)

exemplo:
gcc -o consulta_mysql $(mysql_config --cflags) consulta_mysql.c $(mysql_config --libs)

Exemplo de programa para conexão ao MySQL

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   MYSQL *conexao;
   MYSQL_RES *res;
   MYSQL_ROW linhas;
   MYSQL_FIELD *campos;
   char query[]="select * from <tabela>;";
   int i;

   char *server = "<servidor>";
   char *user = "<usuario>";
   char *password = "<senha>";
   char *database = "<banco>";
   unsigned int port = <porta>;

   conexao = mysql_init(NULL);

   /* Connect to database */
   if (!mysql_real_connect(conexao, server,
         user, password, database, port, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conexao));
      exit(EXIT_FAILURE);
   }

   /* send SQL query */
   if (mysql_query(conexao, query)) {
      fprintf(stderr, "%s\n", mysql_error(conexao));
      exit(EXIT_FAILURE);
   }

   res = mysql_store_result(conexao);
   
   if (res)
   {
     campos = mysql_fetch_fields(res);
     for (i=0; i < mysql_num_fields(res); i++)
     {
       printf("%s", (campos[i]).name);
       if (mysql_num_fields(res) > 1)
          printf("\t");
     }
     
     printf("\n");
     
     while ((linhas = mysql_fetch_row(res)) != NULL)
     {
       for (i=0; i < mysql_num_fields(res); i++)
         printf("%s\t", linhas[i]);
       printf("\n");
     }
   }

   /* close connection */
   mysql_free_result(res);
   mysql_close(conexao);
}

quarta-feira, 24 de abril de 2013

Programas C : Acessar banco de dados Oracle - Linux

Pré-requisitos:
* Obrigatórios (x86 - http://www.oracle.com/technetwork/topics/linuxsoft-082809.html e x86_64 - http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html)
  • Oracle Instant Client Package - Basic (All files required to run OCI, OCCI, and JDBC-OCI applications) - Bibliotecas que permitem o acesso ao banco oracle
  • Oracle Instant Client Package - SDK (Additional header files and an example makefile for developing Oracle applications with Instant Client) - Arquivos source/headers para usar nos programas "C"
* Opcionais
  • Oracle Instant Client Package - SQL*Plus(Additional libraries and executable for running SQL*Plus with Instant Client) - Possibilita a conexão ao Oracle através do SQL *PLUS
TNSNAME
Deve existir o arquivo TNSNAME com as conexões que serão utilizadas. Este arquivo normalmente deverá ficar em /etc/tnsnames.ora


Conector C - Oracle

Ocilib - http://orclib.sourceforge.net/
Após efetuar o download e descompactar o arquivo, use esta dica importante para a instalação:
sudo ./configure --with-oracle-headers-path=<caminho para onde estão os includes do sdk oracle> --with-oracle-home=<caminho do oracle home/instant client onde estão as bibliotecas do oracle>

Exemplo:
sudo ./configure --with-oracle-headers-path=/usr/lib/instantclient_10_2/sdk/include --with-oracle-home=/usr/lib/instantclient_10_2/

Depois:
sudo make
sudo make install

Importante: as variáveis de ambiente ORACLE_HOME e LD_LIBRARY_PATH devem estar setadas !
ORACLE_HOME=<caminho do oracle home/instant client onde estão as bibliotecas do oracle>
LD_LIBRARY_PATH=<caminho do oracle home/instant client onde estão as bibliotecas do oracle>:<caminho onde foram instaladas as bibliotecas do ocilib)
USER_LIBS=<caminho onde está instalado o ocilib>


Exemplos:
(32 bits)
ORACLE_HOME=/usr/lib/instantclient_10_2
LD_LIBRARY_PATH=/usr/lib/instantclient_10_2:/usr/local/lib

(64 bits)
ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client64
LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.4/client64/lib:/usr/local/lib:/usr/local/lib64
USER_LIBS=/usr/local
Para compilar/linkeditar programas

Os seguintes parâmetros deverão ser usados
Compilação:
(32 bits)
-I$USER_LIBS/include 
Linkedição
-L/$ORACLE_HOME -lclntsh -L$USER_LIBS/lib -locilib

Exemplo via linha de comando:
gcc conecta_oracle.c -o conecta_oracle -I$USER_LIBS/include -L/$ORACLE_HOME -lclntsh -L$USER_LIBS/lib -locilib


(64 bits)
Os seguintes parâmetros deverão ser usados
Compilação:
-I$USER_LIBS/include 
Linkedição
-L$ORACLE_HOME/lib -lclntsh -L$USER_LIBS/lib -locilib

Exemplo via linha de comando:
(32 bits)
gcc conecta_oracle.c -o conecta_oracle -I$USER_LIBS/include -L$ORACLE_HOME -lclntsh -L$USER_LIBS/lib -locilib

(64 bits)

gcc conecta_oracle.c -o conecta_oracle -I$USER_LIBS/include -L$ORACLE_HOME/lib -lclntsh -L$USER_LIBS/lib -locilib

Exemplo de programa "C" para acessar banco de dados oracle:

#include "ocilib.h"

int main(void)
{
    OCI_Connection *cn;
    OCI_Statement* st;
    OCI_Resultset* rs;

    if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT))
        return EXIT_FAILURE;

    cn = OCI_ConnectionCreate("VEDBD02_205", "usr_r2s2", "r2s2", OCI_SESSION_DEFAULT);

    printf("Server major    version : %i\n",   OCI_GetServerMajorVersion(cn));
    printf("Server minor    version : %i\n",   OCI_GetServerMinorVersion(cn));
    printf("Server revision version : %i\n\n", OCI_GetServerRevisionVersion(cn));
    printf("Connection      version : %i\n\n", OCI_GetVersionConnection(cn));

    st = OCI_StatementCreate(cn);

    OCI_ExecuteStmt(st, "select id_sdr, dat_ini_vig, dat_fim_vig, vlr_sdr, dat_sdr from tb_groa_valor_sdr order by 1");

    rs = OCI_GetResultset(st);

    while (OCI_FetchNext(rs))
    {
        printf("%i - %s - %s - %s - %s\n", OCI_GetInt(rs, 1), 
            OCI_GetString(rs,2), OCI_GetString(rs,3),
            OCI_GetString(rs,4), OCI_GetString(rs,5));
    }

    OCI_Cleanup();

    return EXIT_SUCCESS;
}