Categoria

Linguagem C

Recursão em C
Linguagem C

Recursão em C

Recursão é uma técnica de programação onde uma função chama a si mesma durante sua execução. Uma função recursiva deve conter dois elementos fundamentais: o caso base (condição de parada) e o caso recursivo (chamada à própria função com parâmetros modificados).

05/05/2026
Resource limits: ulimit e cgroups
Linguagem C 05/05/2026

Resource limits: ulimit e cgroups

Em sistemas Unix e Linux, o gerenciamento de recursos é fundamental para garantir estabilidade, segurança e previsibilidade de execução. Resource limits são mecanismos que restringem o consumo de recursos do sistema por processos, prevenindo que um único programa consuma toda a memória, CPU ou descritores de arquivo, causando negação de serviço ou falhas catastróficas.

Safety-critical code: MISRA C e certificações
Linguagem C 05/05/2026

Safety-critical code: MISRA C e certificações

Sistemas safety-critical são aqueles cuja falha pode resultar em consequências catastróficas: perda de vidas humanas, danos ambientais severos ou prejuízos financeiros irreparáveis. Exemplos clássicos incluem sistemas de freios antibloqueio (ABS) em automóveis, controles de voo em aeronaves, marcapassos cardíacos e sistemas de controle de usinas nucleares.

Profiling com gprof e perf
Linguagem C 05/05/2026

Profiling com gprof e perf

Profiling é o processo de análise dinâmica de um programa para identificar onde o tempo de execução é gasto. Em Linguagem C, essa prática é especialmente crítica devido ao controle manual de memória, acesso direto a hardware e operações de baixo nível que podem esconder gargalos sutis. Diferente de linguagens gerenciadas, em C cada instrução conta — um loop mal otimizado ou uma função de alocação frequente pode degradar drasticamente o desempenho.

Projeto final: implementando um servidor HTTP minimalista em C
Linguagem C 05/05/2026

Projeto final: implementando um servidor HTTP minimalista em C

O protocolo HTTP (Hypertext Transfer Protocol) opera sobre TCP na porta 80. No HTTP/1.0, cada requisição abre uma nova conexão TCP, enquanto no HTTP/1.1 introduziu-se o conceito de conexões persistentes (keep-alive). Uma requisição HTTP típica contém método (GET, POST), URI, versão do protocolo e cabeçalhos no formato Chave: Valor.

Parsing de JSON com jsmn ou cJSON
Linguagem C 05/05/2026

Parsing de JSON com jsmn ou cJSON

Em projetos embarcados, sistemas operacionais mínimos ou servidores HTTP com restrições severas de memória, bibliotecas como json-c ou Jansson podem ser excessivas. Elas introduzem dependências pesadas, alocação dinâmica intensiva e um footprint de binário que pode inviabilizar o uso em microcontroladores com poucos kilobytes de RAM. Além disso, muitas vezes o desenvolvedor precisa apenas de parsing básico, sem manipulação complexa da árvore JSON.

Pilha e heap: entendendo a memória do processo
Linguagem C 05/05/2026

Pilha e heap: entendendo a memória do processo

Quando um programa em C é executado, o sistema operacional cria um espaço de endereçamento virtual dividido em segmentos distintos. Cada segmento tem uma finalidade específica e regras de acesso próprias. Os principais segmentos são:

Pipes: comunicação entre processos
Linguagem C 05/05/2026

Pipes: comunicação entre processos

Pipes são um dos mecanismos mais antigos e fundamentais de comunicação entre processos (IPC) no Unix/Linux. Um pipe funciona como um canal unidirecional de dados: um processo escreve em uma extremidade e outro processo lê da outra extremidade. Os dados trafegam em ordem FIFO (first-in, first-out).

Plugin systems: carregamento dinâmico com dlopen
Linguagem C 05/05/2026

Plugin systems: carregamento dinâmico com dlopen

Bibliotecas estáticas (.a no Linux) são incorporadas ao executável durante a linkagem, resultando em um binário monolítico. Bibliotecas dinâmicas (.so) permanecem como arquivos separados e são carregadas em tempo de execução. A principal vantagem das dinâmicas é a possibilidade de estender a aplicação sem recompilá-la, além de reduzir o tamanho do executável.

Ponteiros duplos e matrizes dinâmicas
Linguagem C 05/05/2026

Ponteiros duplos e matrizes dinâmicas

Um ponteiro duplo é declarado com dois asteriscos: int *ptr;. Isso significa que ptr é um ponteiro que armazena o endereço de outro ponteiro do tipo int. Em outras palavras, é um ponteiro para um ponteiro para um inteiro.