Você está na página 1de 25

Primeiros Elogios ao Use a Cabeça!

“Use a Cabeça! C possivelmente pode acabar sendo o melhor livro de C de todos os


tempos. Eu poderia facilmente visualizá-lo se tornando o livro didático padrão para
curso de faculdade sobre C. A maioria dos livros sobre programação segue um caminho
relativamente previsível. Este livro, por outro lado, utiliza uma abordagem completamente
diferente. Ele te ensina a ser um verdadeiro programador em C.”
— Dave Kitabjian, diretor de Desenvolvimento de Software, NetCarrier Telecom

“ Use a Cabeça! C é uma introdução acessível e animada à programação em C, no clássico


estilo da série Use a Cabeça!. Figuras, piadas, exercícios e laboratórios guiam o leitor
suavemente, porém de forma constante, pelos fundamentos de C... antes de avançar para
tópicos mais avançados de programação em sistemas Posix e Linux.”
— Vince Milner, desenvolvedor de software
Elogios a outros livros da série

“O livro de Kathy e Bert Use a Cabeça! Java transforma a página impressa em algo semelhante
a uma GUI (Interface Gráfica do Utilizador) que você já tenha visto. Com um jeito
bem-humorado e moderno, os autores fazem do aprendizado de Java uma experiência
envolvente do tipo ‘o que eles farão a seguir?’”
— Warren Keuffel, Revista Software Development

“Além do estilo interessante que o leva do saber nada para o status de guerreiro Java, Use a
Cabeça! Java inclui uma enorme quantidade de assuntos práticos que outros textos deixam
como o temido ‘exercício para o leitor...’. É inteligente, bem-humorado, moderno e prático
– e não há muitos livros didáticos que podem fazer tal alegação e cumpri-la, enquanto
também ensinam serialização de objetos e protocolos de redes.”
— Dr. Dan Russell, diretor de Pesquisa de Ciência e Experiência do Usuário,
IBM Centro de Pesquisa Almaden; instrutor de inteligência artificial,
Universidade de Stanford

“É rápido, irreverente, divertido e interessante. Tome cuidado – você poderá realmente


aprender alguma coisa!”
— Ken Arnold, ex-engenheiro sênior da Sun Microsystems; coautor (com James
Gosling, criador da linguagem Java) do The Java Programming Language

“Me sinto como se mil quilos de livros fossem retirados de cima da minha cabeça.”
— Ward Cunningham, inventor do Wiki e fundador do Hillside Group

“Exatamente a coisa certa para o guru informal geek em cada um de nós. A referência certa
para estratégias práticas de desenvolvimento estimula meu cérebro, sem ter de me arrastar
por um monte de papo cansativo e antiquado de professor.”
— Travis Kalanick, fundador de Scour e Red Swoosh; membro do MIT TR100

“Existem livros que você compra, livros que você guarda, livros que você deixa na
escrivaninha e, graças a O’Reilly e à equipe Use a Cabeça!, há a penúltima categoria, os livros
Use a Cabeça!. São aqueles livros usados, em péssimo estado, que são levados para todo lugar.
Use a Cabeça! SQL está no topo da minha pilha. Cara, mesmo o PDF que tenho para revisão
está esfarrapado e rasgado.”
— Bill Sawyer, gerente de Currículo ATG, Oracle

“A admirável clareza, o humor e as doses significativas de inteligência tornam o livro ideal


para resolução de problemas, até mesmo para não programadores.”
— Cory Doctorow, coeditor de Boing Boing, autor de Down and OUt in the Magic
Kingdom e Someone Comes to Town, Someone Leaves Town
Elogios a outros livros da série

“Eu recebi o livro ontem e comecei a lê-lo... e não consegui parar. Isso definitivamente é
très ‘maneiro’. É divertido, porém transmite muito conteúdo, e vai direto ao assunto. Estou
realmente impressionado.”
— Erich Gamma, engenheiro distinto da IBM e coautor de Design Patterns

“Um dos livros mais engraçados e inteligentes sobre design de software que já li.”
— Aaron LaBerge, VP Technology, ESPN.com

“O que antes era um processo de aprendizado demorado de tentativa e erro, agora é


reduzido nitidamente em um livro cativante.”
— Mike Davidson, CEO, Newsvine, Inc.

“Design elegante é a essência de cada capítulo aqui, cada conceito transmitido com doses
iguais de pragmatismo e humor.”
— Ken Goldstein, vice-presidente executivo, Disney Online

“Eu ! Use a Cabeça! HTML com CSS e XHTML – ele ensina tudo o que você precisa aprender
em um formato revestido de diversão.”
— Sally Applin, designer IU e artista

“Geralmente quando leio um livro ou artigo sobre padrões de projetos, preciso


ocasionalmente optar por medidas drásticas para me certificar de que estou prestando
atenção. Não com este livro. Por mais estranho que pareça, ele faz com que seja
divertido aprender.

Enquanto outros livros estão dizendo ‘Bueller...Bueller...Bueller’, este livro está no carro
alegórico dizendo ‘Shake it up, baby!’”
— Eric Wuehler

“Eu literalmente amo este livro. De fato, eu o beijei na frente da minha mulher.”
— Satish Kumar
Outros livros da série Use a Cabeça!
Use a Cabeça! Ajax Profissional
Use a Cabeça! Álgebra
Use a Cabeça! Análise e Projeto Orientado ao Objeto
Use a Cabeça! Análise de Dados
Use a Cabeça! C# – 2ª Edição
Use a Cabeça! Desenvolvimento de Software
Use a Cabeça! Desenvolvendo para iPhone & iPad
Use a Cabeça! Estatística
Use a Cabeça! Excel
Use a Cabeça! Física
Use a Cabeça! Geometria 2D
Use a Cabeça! Java – 2ª Edição
Use a Cabeça! JavaScript
Use a Cabeça! jQuery
Use a Cabeça! Mobile Web
Use a Cabeça! Padrões de Projetos – 2ª Edição
Use a Cabeça! Programação
Use a Cabeça! PHP & MySQL
Use a Cabeça! PMP
Use a Cabeça! Python
Use a Cabeça! Rails – 2ª Edição
Use a Cabeça! Redes de Computadores
Use a Cabeça! Servlets & JSP – 2ª Edição
Use a Cabeça! SQL
Use a Cabeça! Web Design
Use a Cabeça! C

Não seria maravilhoso se existisse


um livro sobre C que fosse mais
fácil de entender do que o manual
de operação de um ônibus espacial?
Acho que é apenas um sonho...

David Griffiths
Dawn Griffiths

Rio de Janeiro, 2013


Para Dennis Ritchie (1941-2011), o pai do C.
os autores

Autores de Use a Cabeça! C

s
David Griffith

Dawn Griffiths

David Griffiths começou a programar Você pode seguir o David no Twitter:


aos 12 anos de idade, quando viu um http://twitter.com/dogriffiths.
documentário sobre o trabalho de
Dawn Griffiths começou a vida
Seymour Papert. Aos 15, ele escreveu uma
matemática em uma universidade top
implementação da linguagem computacional
do Reino Unido, onde foi premiada
de Papert, o LOGO. Depois de estudar
como primeira da classe de licenciatura.
matemática na universidade, começou a
Ela passou a seguir uma carreira em
escrever código para computadores e artigos
desenvolvimento de software e tem mais de
de revista para humanos. Ele trabalhou como
quinze anos de experiência na indústria de
coach de metodologias ágeis, programador e
Tecnologia da Informação.
atendente de garagem, mas não nesta ordem.
David Griffiths pode escrever código em mais Antes de juntar forças com David em Use a
de dez linguagens, e prosa em apenas uma, e, Cabeça! C, Dawn escreveu outros dois livros
quando não está escrevendo, programando, Use a Cabeça! (Use a Cabeça! Estatística e Use
ou trabalhando como coach, ele passa a maior a Cabeça! Geometria 2D) e também trabalhou
parte do seu tempo livre com sua adorável em muitos outros livros da série.
esposa – e coautora, – Dawn.
Quando Dawn não está trabalhando, você
Antes de escrever Use a Cabeça! C, a verá aprimorando suas habilidades de Tai
David escreveu dois outros livros Use a Chi, correndo, confeccionando renda de
Cabeça!: Use a Cabeça! Rails e Use a Cabeça! bilro, ou cozinhando. Ela também curte
Programação. viajar e passar o tempo com seu marido,
David.

viii
conteúdo

Conteúdo Resumido
Introdução xxvii
1 Começando com c: Mergulhando de cabeça 1
2 Memória e ponteiros: Para o que está apontando? 41
2.5 Strings: Teoria de strings 83
3 Criando ferramentas pequenas: Faça uma coisa e faça-a bem 103
4 Usando múltiplos arquivos fonte: Desmonte e reconstrua 157
C Lab 1: Arduino 207
5 Structs, unions e bitfields: Criando suas próprias estruturas 217
6 Estruturas de dados e memória dinâmica: Construindo pontes 267
7 Funções avançadas: Aumente suas funções para onze 311
8 Bibliotecas estáticas e dinâmicas: Código Hot-Swappable 351
C Lab2: OpenCV 389
9 Processos e chamadas de sistema: Quebrando limites 397
10 Comunicação entre processos: É bom conversar. 429
11 Sockets e redes: Não há lugar como 127.0.0.1 467
12 Threads: É um mundo paralelo 501
C Lab 3: Blasteroids 523
i Sobras: As dez melhores coisas (que não cobrimos) 539
ii Tópicos C: Revisão geral 553

Conteúdo
Introdução
Seu cérebro sobre C. Aqui você está tentando aprender algo;
enquanto isso, aqui está o seu cérebro lhe fazendo o favor de se certificar de
que o aprendizado não role. Seu cérebro está pensando: “É melhor deixar
espaço para coisas mais importantes, como quais animais selvagens evitar e
se praticar snowboarding pelado é uma má ideia”. Então, como você engana
seu cérebro para que ele pense que sua vida depende de conhecer C?

A quem se destina este livro? xxviii


Sabemos o que você está pensando xxix
Metacognição: xxxi
Leve sua mente à submissão xxxiii
Leia-me xxxiv
Revisão técnica xxxvi
Agradecimentos xxxvii

você está aqui ! ix


conteúdo

começando com c

1 Mergulhando de cabeça
Quer entrar de cabeça no computador? Precisa escrever um
código de alta performance para um novo jogo? Programar um Arduino?
Ou usar aquela biblioteca de terceiros avançada no seu app de iPhone?
Se for o caso, então C está aqui para ajudar. C funciona em um nível muito
mais baixo que outras linguagens; então, entender C te dá uma ideia
muito melhor do que realmente está acontecendo. C até pode te ajudar a
entender melhor outras linguagens. Então, mergulhe de cabeça, pegue seu
compilador, e você começará em pouco tempo.

C é uma linguagem para programas pequenos e rápidos 2


Mas o que um programa C completo parece? 5
Mas como você executa o programa? 9
Dois tipos de comandos 14
Aqui está o código até agora 15
Contar cartas? Em C? 17
Há mais em booleanos que igual... 18
Como está o código agora? 25
Usando o velho switch 26
Às vezes, uma vez não é o bastante... 29
Loops frequentemente usam a mesma estrutura... 30
Use break para fugir... 31
Sua Caixa de Ferramentas C 40

x
conteúdo

memória e ponteiros

2 Para o que está apontando?


Se você realmente quer arrasar com C, você precisa
entender como C gerencia memória. A linguagem C lhe
dá muito mais controle sobre como seu programa usa a memória do
computador. Neste capítulo, você irá abaixo da superfície e verá exatamente
o que acontece quando lê e cria variáveis. Você aprenderá como arrays
funcionam, como evitar desagradáveis desastres de memória e, mais
importante que tudo, verá como dominar ponteiros e endereçamento de
memória é chave para se tornar um programador fera em C.

Código C inclui ponteiros 42


Escavando na memória 43
Navegue com ponteiros 44
Tente passar um ponteiro para a variável 47
Usando ponteiros de memória 48
Como passar uma string para uma função? 53
Variáveis array são como ponteiros... 54
2 O que o computador pensa quando executa seu código 55
Mas variáveis array não são exatamente ponteiros. 59
Porque arrays na realidade começam no 0 61
Por que ponteiros têm tipos? 62
Usando ponteiros para entrada de dados 65
Tome cuidado com scanf() 66
fgets() é uma alternativa para scanf() 67
String literais nunca podem ser atualizadas. 72
GLOBAIS 1
Se for modificar uma string, faça uma cópia. 74

CONSTANTES Memorizador de memória 80


Sua Caixa de Ferramentas C 81
LINK A6, #VARSIZE
MOVEM.L DO-D7/A1-A5, (SP)
MOVE.L SP, SAVESTK(A6)
MOVE.L SP, SAVEAS(A6)
MOVE.L GRAFGLOBALS(A5), AO

xi
conteúdo

strings
Teoria de strings
Existe mais em strings do que apenas a leitura. Você viu
como strings em C são, na realidade, arrays de char, mas o que C te deixa
fazer com elas? Isto é, quando string.h entra em jogo. string.h é uma parte
da Biblioteca Padrão do C que é dedicada à manipulação de strings. Se
quiser concatenar strings, copiar uma string para outra ou comparar duas
strings, as funções em string.h estão à sua disposição. Neste capítulo, verá
como criar um array de strings e, depois, verá exatamente como realizar
buscas em strings usando a função strstr().

Procura-se Frank desesperadamente 84


Crie um array de arrays 85
Encontre strings contendo o texto de busca 86
Usando a função strstr() 89
Tá na hora de revisar o código 94
Array de arrays vs. array de ponteiros 98
Sua Caixa de Ferramentas C 101

xii
conteúdo

criando ferramentas pequenas

3 Faça uma coisa, e faça-a bem


Todo sistema operacional inclui ferramentas
pequenas. Ferramentas pequenas escritas em C realizam pequenas
tarefas especializadas, tais como ler e escrever arquivos ou filtrar dados. Se
quiser realizar tarefas mais complexas, pode até ligar diversas ferramentas
juntas. Mas como estas ferramentas pequenas são criadas? Neste capítulo,
você verá a matéria-prima para a fabricação das ferramentas pequenas.
Você descobrirá como controlar as opções da linha de comando e como
gerenciar tráfego de informação e redirecionamento, criando ferramentas
em pouco tempo.

Ferramentas pequenas podem solucionar grandes problemas 104


Aqui está como o programa deveria funcionar 108
Mas você não está usando arquivos... 109
Pode usar redirecionamento 110
Apresentando o Erro Padrão 120
Por default, o Erro Padrão é enviado ao display 121
fprintf() imprime para um fluxo de dados 122
Vamos atualizar o código para usar fprintf() 123
Ferramentas pequenas são flexíveis 128
Não mude a ferramenta geo2json 129
Uma tarefa diferente precisa de uma ferramenta diferente. 130
Ligue sua entrada e saída com um pipe 131
A ferramenta bermuda 132
Mas e se quiser enviar output para mais de um arquivo? 137
Crie seus próprios fluxos de dados 138
Existe mais na main() 141
Deixe a biblioteca fazer o seu trabalho 149
Sua Caixa de Ferramentas C 156

xiii
conteúdo

usando múltiplos arquivos fonte

4 Desmonte e reconstrua
Se for criar um grande programa, você não quer
grandes arquivos fonte. Você consegue imaginar como seria difícil
e demorado fazer a manutenção de um único arquivo fonte para um programa
a nível empresarial? Neste capítulo, você aprenderá como C permite quebrar
seu código-fonte em segmentos pequenos e gerenciáveis e, depois,
reconstruí-los em um grande programa. Durante o caminho, aprenderá um
pouco mais sobre sutilezas de tipos de dados e conhecerá seu novo melhor
amigo: make.

Seu guia rápido para tipos de dados 162


Não coloque algo grande em algo pequeno 163
Use casting para colocar floats em números inteiros 164
Essa não... os atores sem emprego... 168
Vamos ver o que aconteceu com o código 169
Compiladores não gostam de surpresas 171
Separe a declaração da definição 173
Criando seu primeiro arquivo header 174
Se tiver características em comum... 182
Pode dividir o código em arquivos separados 183
Compilação por trás das cenas 184
O código compartilhado precisa de seu
próprio arquivo header 186
Não é física quântica… ou será que é? 189
Não recompile cada arquivo 190
Primeiro compile a fonte em arquivos objetos 191
É difícil manter o controle sob os arquivos 196
Automatize seus builds com a ferramenta make 198
Como make funciona 199
Mostre seu código para make com makefile. 200
Sua Caixa de Ferramentas C 206

xiv
conteúdo

C Lab 1
Arduino
Você sempre quis que suas plantas pudessem
te dizer quando precisam ser regadas? Bem,
com Arduino elas podem! Neste lab, você
criará um monitor de planta alimentado por
Arduino todo programado em C.

xv
conteúdo

structs, unions e bitfields

5 Criando suas próprias estruturas


A maioria das coisas na vida é mais complexa que um
simples número. Até agora, temos visto os tipos básicos de dados
da linguagem C, mas e se você quiser ir além dos números e segmentos de
texto e modelar as coisas no mundo real? structs permitem que você
modele complexidades do mundo real através da criação de suas próprias
estruturas. Neste capítulo, você aprenderá como combinar os tipos básicos
de dados em structs e até manejar as incertezas da vida com unions.
E, se quiser um simples sim ou não, bitfields podem ser exatamente o que
você precisa.

Às vezes, você precisa distribuir muitos dados. 218


Conversa de cubículo 219
Crie seu próprio tipo estruturado de dados com um struct 220
Só dê-lhes o peixe 221
Leia os campos do struct com o operador “.” 222
É possível colocar um struct dentro do outro? 227
Como você atualiza um struct? 236
O código está clonando a tartaruga 238
Você precisa de um ponteiro para o struct 239
(*t).age vs. *t.age 240
Às vezes, o mesmo tipo de coisa precisa de tipos
diferentes de dados. 246
Um union deixa você reutilizar espaço de memória. 247
Como se usa o union? 248
Uma variável enum armazena um símbolo 255
Às vezes, você quer controlar o nível de bits. 261
Bitfields armazenam uma quantidade
customizável de bits 262
Sua Caixa de Ferramentas C 266

xvi
conteúdo

estruturas de dados e memória dinâmica

6 Construindo pontes
Às vezes, um único struct simplesmente não é
o suficiente. Para modelar requisitos complexos de dados, você
frequentemente precisa juntar structs. Neste capítulo, você verá
como usar ponteiros struct para ligar tipos customizados de dados em
estruturas de dados grandes e complexas. Você explorará princípios-
chave, criando listas encadeadas. Você também verá como fazer com que
suas estruturas de dados aceitem quantidades flexíveis de dados, alocando
memória dinamicamente no heap e liberando a memória quando tiver
terminado. E, se a boa economia doméstica ficar complicada, também
aprenderá como valgrind pode ajudar.

Você precisa de armazenamento flexível? 268


Listas encadeadas são como correntes de dados. 269
Listas encadeadas permitem inserções. 270
Crie uma estrutura recursiva 271
Crie ilhas em C... 272
Inserindo valores na lista 273
Use o heap para armazenamento dinâmico 278
Devolva a memória quando terminar 279
Peça memória com malloc()... 280
Vamos consertar o código usando a função strdup() 286
Libere a memória ao terminar 290
Uma visão geral do sistema SIPS 300
Software Forense: usando valgrind 302
Use valgrind repetidamente para coletar mais evidência. 303
Olhe a evidência 304
A solução em julgamento 307
Sua Caixa de Ferramentas C 309

xvii
conteúdo

funções avançadas

7 Aumente suas funções para onze


Funções básicas são ótimas, mas às vezes você
precisa de mais. Até agora, você tem se concentrado no básico. Mas
e se precisar de ainda mais poder e flexibilidade para conseguir o que quer?
Neste capítulo, você verá como aumentar o QI do seu código passando
funções como parâmetros. Você descobrirá como organizar as coisas com
funções de comparação. E, finalmente, descobrirá como fazer seu código
muito flexível com funções com argumentos variáveis.

Procurando o Sr. Certo... 312


Passando código a uma função 316
Você precisa dizer para find() o nome de uma função. 317
Todo nome de função é um ponteiro para a função... 318
...mas não existe tipo de dados function 319
Como criar ponteiros para funções 320
Organize-se com a Biblioteca Padrão C 325
Use os ponteiros para funções para pôr as coisas em ordem. 326
Automatizando as cartas da agência de namoro 334
Crie um array de ponteiros para funções 338
Faça sua função flexível 343
Sua Caixa de Ferramentas C 350

xviii
conteúdo

bibliotecas estáticas e dinâmicas

8 Código Hot-Swappable
Você já viu o poder de bibliotecas padrão. Agora chegou
a hora de usar este poder para o seu código. Neste capítulo, verá como
criar suas próprias bibliotecas e reutilizar o mesmo código em vários
programas. E mais, aprenderá como compartilhar código durante o tempo
de execução com bibliotecas dinâmicas e os segredos dos programadores
gurus. E, ao terminar o capítulo, você será capaz de escrever código escalável
que poderá ser dimensionado e gerenciado de forma simples e eficiente.

Código que você pode levar ao banco 352


Maior e menor são para headers padrão 354
Mas e se quiser compartilhar código? 355
Compartilhando arquivos header .h 356
Compartilhe arquivos de objetos .o usando o
pathname completo 357
Um depósito contém arquivos .o. 358
Crie um arquivo com o comando ar... 359
Finalmente, compile seus outros programas. 360
A Academia Use a Cabeça! está virando global. 365
Calculando calorias 366
Mas as coisas são um pouco mais complexas... 369
Programas são compostos de vários pedaços... 370
Ligações dinâmicas acontecem durante o
tempo de execução 372
Dá para fazer uma ligação .a durante o tempo
de execução? 373
Primeiro crie um arquivo objeto 374
O nome que der para sua biblioteca dinâmica depende
da sua plataforma. 375
Sua Caixa de Ferramentas C 387

xix
conteúdo

C Lab2
OpenCV
Imagine se seu computador pudesse ficar de
olho na sua casa, enquanto você está fora, e
te dizer quem tem perambulado por aí. Neste
lab, você criará um detector de intrusos à
base de C usando a astúcia do OpenCV.

xx
conteúdo

processos e chamadas de sistema

9 Quebrando limites
Está na hora de pensar fora da caixa Você já sabe que pode
criar aplicativos complexos conectando ferramentas pequenas na linha de
comando. Mas, e se quiser usar outros programas do seu próprio código?
Neste capítulo, você aprenderá como usar serviços do sistema para criar e
controlar processos. Com isso, seus programas terão acesso a e-mail, web e
quaisquer outras ferramentas que tenha instalado. Ao terminar este capítulo,
você terá a capacidade de ir além do C.

Chamadas ao sistema são sua conexão ao SO 398


Aí alguém invadiu o sistema... 402
Segurança não é o único problema 403
As funções exec() lhe dão mais controle 404
Há várias funções exec() 405
As funções array: execv(), execpv(), execve() 406
Passando variáveis de ambiente 407
A maioria das chamadas de sistema cometem
o mesmo erro 408
Leia as notícias com RSS 416
exec() é o fim da linha para o seu programa 420
Executando um processo filho com fork() + exec() 421
Sua Caixa de Ferramentas C 427

xxi
conteúdo

comunicação entre processos

10 É bom conversar
Criar processos é apenas metade da história E se você
quiser controlar o processo quando este estiver em execução? E se quiser
enviar dados para ele? Comunicação entre processos os deixa realizar o
trabalho em conjunto. Vamos te mostrar como multiplicar o poder do seu
código deixando ele conversar com outros programas no seu sistema.

Redirecionando a entrada e a saída 430


Olhando por dentro de um processo típico 431
Redirecionamento simplesmente substitui o fluxo de dados 432
fileno() te diz qual é o descritor 433
Às vezes, você precisa esperar... 438
Fique em contato com seu filho 442
Conecte seus processos com pipes 443
Estudo de caso: abrindo histórias em um navegador 444
No filho 445
No pai 445
Abrindo uma página web em um navegador 446
A morte de um processo 451
Pegando os sinais e executando o seu código 452
sigactions são registradas com sigaction() 453
Reescrevendo o código para
usar um tratador de sinais 454
Use kill para enviar sinais 457
Enviando uma chamada de alerta
para seu código 458
Sua Caixa de Ferramentas C 466

xxii
conteúdo

sockets e redes

11 Não há lugar como 127.0.0.1


Programas em máquinas diferentes precisam
conversar. Você aprendeu como usar I/O para se comunicar com arquivos
e como processos na mesma máquina podem se comunicar entre si. Agora
você vai precisar entrar em contato com o resto do mundo e aprender como
escrever programas em C que podem conversar com outros programas do
outro lado da rede e do outro lado do mundo. Ao terminar este capítulo,
você será capaz de criar programas que atuam como servers e programas
que atuam como clientes.

O servidor de internet knock-knock 468


Visão geral do servidor knock-knock 469
BLAB: como servidores conversam com a internet 470
Um socket não é um típico fluxo de dados 472
Às vezes o servidor não inicializa corretamente. 476
O motivo pelo qual sua mãe sempre mandou
verificar seu trabalho 477
Lendo dados do cliente 478
O servidor só pode falar com uma pessoa por vez. 485
Você pode fork() um processo para cada cliente 486
Escrevendo um cliente web 490
Clientes que mandam 491
Crie um socket para um endereço IP 492
getaddrinfo() pega endereços para domínios 493
Sua Caixa de Ferramentas C 500

xxiii
conteúdo

threads

12 É um mundo paralelo
Frequentemente programas precisam fazer diversas
coisas ao mesmo tempo. Threads POSIX podem fazer seu código
mais interativo, separando alguns segmentos de código para serem
executados em paralelo. Mas tenha cuidado! Threads são ferramentas
poderosas, mas você não quer que elas entrem em colisão. Neste capítulo,
você aprenderá como colocar sinais de trânsito e marcadores de pista
que irão prevenir um acidente de código. No final, você saberá como criar
threads POSIX e como usar mecanismos de sincronização para proteger a
autenticidade de dados sensitivos.

Tarefas são sequenciais... ou não... 502


...e processos não são sempre a solução 503
Processos simples fazem uma coisa de cada vez 504
Contrate funcionários extras: use threads 505
Como se criam threads? 506
Crie threads com pthread_create. 507
O código não é seguro para threads 512
Você precisa acrescentar sinais de trânsito 513
Use mutex como sinal de trânsito 514
Sua Caixa de Ferramentas C 521

A Variável
compartilhada

xxiv
conteúdo

C Lab 3
Blasteroids
Neste lab, você fará um tributo a um dos
videogames mais populares e de longa
vida entre todos. Está na hora de criar
Blasteroids!

xxv
conteúdo

sobras

i As dez melhores coisas (que não


cobrimos)
Mesmo depois de tudo aquilo, ainda tem mais um
pouquinho. Tem mais algumas coisas que achamos que você precisa
saber. Não nos sentiríamos bem ignorando-as, mesmo que precisem de uma
breve menção, e nós realmente queremos lhe dar um livro que você possa
carregar sem treinamento intensivo na academia do bairro. Então, antes de
guardar este livro, leia estes acréscimos.

1. Operadores 540
2. Diretivas do pré-processador 542
3. A palavra-chave static 543
4. Qual o tamanho das coisas 544
5. Testes automatizados 545
6. Mais sobre gcc 546
7. Mais sobre make 548
8. Ferramentas de desenvolvimento 550
9. Criando GUIs 551
10. Material de referência 552

Tópicos C

ii Revisão geral
Você já quis que todos aqueles ótimos fatos sobre C
estivessem em um só lugar? Essa é uma reunião de todos os
tópicos e princípios de C que apresentamos no livro. Dê uma olhada
e veja se consegue se lembrar de todos. Cada fato tem o capítulo
de origem ao lado, então fica fácil procurar a referência se precisar
de um lembrete. Talvez você até queira destacar estas páginas
para colocar na sua parede.

xxvi

Você também pode gostar