Você está na página 1de 25

Primeiros Elogios ao Use a Cabeça! C

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

tópicos mais avançados de programação em sistemas Posix e Linux.”

antes de avançar para

— 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

– 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.”

’.

É inteligente, bem-humorado, moderno e prático

— 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

très ‘maneiro’. É divertido, porém transmite muito conteúdo, e vai direto ao assunto. Estou

realmente impressionado.”

e não consegui parar. Isso definitivamente é

— 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 alegórico dizendo ‘Shake it up, baby!’”

— Eric Wuehler

Bueller

Bueller’,

este livro está no carro

“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
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
de operação de um ônibus espacial? Acho que é apenas um sonho David Griffiths Dawn Griffiths

David Griffiths Dawn Griffiths

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

Dawn Griffiths David Griffiths
Dawn Griffiths
David Griffiths

David Griffiths começou a programar aos 12 anos de idade, quando viu um documentário sobre o trabalho de Seymour Papert. Aos 15, ele escreveu uma implementação da linguagem computacional de Papert, o LOGO. Depois de estudar matemática na universidade, começou a escrever código para computadores e artigos de revista para humanos. Ele trabalhou como coach de metodologias ágeis, programador e atendente de garagem, mas não nesta ordem. David Griffiths pode escrever código em mais de dez linguagens, e prosa em apenas uma, e, quando não está escrevendo, programando, ou trabalhando como coach, ele passa a maior parte do seu tempo livre com sua adorável esposa – e coautora, – Dawn.

Antes de escrever Use a Cabeça! C, David escreveu dois outros livros Use a Cabeça!: Use a Cabeça! Rails e Use a Cabeça! Programação.

Você pode seguir o David no Twitter:

http://twitter.com/dogriffiths.

Dawn Griffiths começou a vida

matemática em uma universidade top do Reino Unido, onde foi premiada como primeira da classe de licenciatura. Ela passou a seguir uma carreira em desenvolvimento de software e tem mais de quinze anos de experiência na indústria de Tecnologia da Informação.

Antes de juntar forças com David em Use a Cabeça! C, Dawn escreveu outros dois livros Use a Cabeça! (Use a Cabeça! Estatística e Use a Cabeça! Geometria 2D) e também trabalhou em muitos outros livros da série.

Quando Dawn não está trabalhando, você a verá aprimorando suas habilidades de Tai Chi, correndo, confeccionando renda de bilro, ou cozinhando. Ela também curte viajar e passar o tempo com seu marido, David.

Conteúdo Resumido

conteúdo

 

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

conteúdo

começando com c 1 Mergulhando de cabeça Quer entrar de cabeça no computador? Precisa escrever
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
Mas o que um programa C completo parece?
Mas como você executa o programa?
Dois tipos de comandos
Aqui está o código até agora
Contar cartas? Em C?
Há mais em booleanos que igual
Como está o código agora?
Usando o velho switch
Às vezes, uma vez não é o bastante
Loops frequentemente usam a mesma estrutura
Use break para fugir
Sua Caixa de Ferramentas C
2
5
9
14
15
17
18
25
26
29
30
31
40

2

conteúdo

memória e ponteiros

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 Escavando na memória Navegue com ponteiros Tente passar um ponteiro para a variável Usando ponteiros de memória Como passar uma string para uma função? Variáveis array são como ponteiros

O 2 GLOBAIS Se 1 CONSTANTES Memorizador de memória Sua Caixa de Ferramentas C LINK
O
2
GLOBAIS
Se
1
CONSTANTES
Memorizador de memória
Sua Caixa de Ferramentas C
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

que o computador pensa quando executa seu código

Mas variáveis array não são exatamente ponteiros.

Porque arrays na realidade começam no 0 Por que ponteiros têm tipos? Usando ponteiros para entrada de dados Tome cuidado com scanf() fgets() é uma alternativa para scanf()

String literais nunca podem ser atualizadas.

for modificar uma string, faça uma cópia.

ser atualizadas. for modificar uma string, faça uma cópia. 42 43 44 47 48 53 54

42

43

44

47

48

53

54

55

59

61

62

65

66

67

72

74

80

81

conteúdo

conteúdo strings Teoria de strings Existe mais em strings do que apenas a leitura. Você viu

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

hora de revisar o código 94 Array de arrays vs. array de ponteiros 98 Sua Caixa

3

conteúdo

criando ferramentas pequenas

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

Existe mais na main() 141 Deixe a biblioteca fazer o seu trabalho 149 Sua Caixa de
Existe mais na main() 141 Deixe a biblioteca fazer o seu trabalho 149 Sua Caixa de
Existe mais na main() 141 Deixe a biblioteca fazer o seu trabalho 149 Sua Caixa de

xiii

conteúdo

4

usando múltiplos arquivos fonte

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.

tipos de dados e conhecerá seu novo melhor amigo: make . Seu guia rápido para tipos

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

conteúdo cocon C Lab 1 Arduino Você sempre quis que suas plantas pudessem te dizer
conteúdo cocon
conteúdo
cocon

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.

Bem, com Arduino elas podem! Neste lab, você criará um monitor de planta alimentado por Arduino
Bem, com Arduino elas podem! Neste lab, você criará um monitor de planta alimentado por Arduino
xv
xv

conteúdo

5

structs, unions e bitfields

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.

Conversa de cubículo

Crie seu próprio tipo estruturado de dados com um struct

Só dê-lhes o peixe

Leia os campos do struct com o operador “.”

É possível colocar um struct dentro do outro?

Como você atualiza um struct?

O código está clonando a tartaruga

Você precisa de um ponteiro para o struct

(*t).age vs. *t.age

218

219

220

221

222

227

236

238

239

240

Às vezes, o mesmo tipo de coisa precisa de tipos diferentes de dados.

Um union deixa você reutilizar espaço de memória.

Como se usa o union?

Uma variável enum armazena um símbolo

Às vezes, você quer controlar o nível de bits.

246

247

248

255

261

você quer controlar o nível de bits. 246 247 248 255 261 xvi Bitfields armazenam uma

xvi

quer controlar o nível de bits. 246 247 248 255 261 xvi Bitfields armazenam uma quantidade

Bitfields armazenam uma quantidade customizável de bits

Sua Caixa de Ferramentas C

262

266

bits. 246 247 248 255 261 xvi Bitfields armazenam uma quantidade customizável de bits Sua Caixa
bits. 246 247 248 255 261 xvi Bitfields armazenam uma quantidade customizável de bits Sua Caixa

conteúdo

6

estruturas de dados e memória dinâmica

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? Listas encadeadas são como correntes de dados. Listas encadeadas permitem inserções. Crie uma estrutura recursiva Crie ilhas em C Inserindo valores na lista Use o heap para armazenamento dinâmico Devolva a memória quando terminar Peça memória com malloc() Vamos consertar o código usando a função strdup() Libere a memória ao terminar Uma visão geral do sistema SIPS Software Forense: usando valgrind Use valgrind repetidamente para coletar mais evidência. Olhe a evidência A solução em julgamento Sua Caixa de Ferramentas C

268

269

270

271

272

273

278

279

280

286

290

300

302

303

304

307

309

em julgamento Sua Caixa de Ferramentas C 268 269 270 271 272 273 278 279 280
em julgamento Sua Caixa de Ferramentas C 268 269 270 271 272 273 278 279 280
xvii
xvii
em julgamento Sua Caixa de Ferramentas C 268 269 270 271 272 273 278 279 280

conteúdo

7

funções avançadas

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

de ponteiros para funções 338 Faça sua função flexível 343 Sua Caixa de Ferramentas C 350

8

8 conteúdo bibliotecas estáticas e dinâmicas Código Hot-Swappable Você já viu o poder de bibliotecas padrão.

conteúdo

bibliotecas estáticas e dinâmicas

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

Maior e menor são para headers padrão

Mas e se quiser compartilhar código?

Compartilhando arquivos header .h

Compartilhe arquivos de objetos .o usando o pathname completo

Um depósito contém arquivos .o.

Crie um arquivo com o comando ar

Finalmente, compile seus outros programas.

A Academia Use a Cabeça! está virando global.

Calculando calorias

Mas as coisas são um pouco mais complexas

Programas são compostos de vários pedaços

Ligações dinâmicas acontecem durante o tempo de execução

Dá para fazer uma ligação .a durante o tempo de execução?

Primeiro crie um arquivo objeto

O nome que der para sua biblioteca dinâmica depende da sua plataforma.

Sua Caixa de Ferramentas C

depende da sua plataforma. Sua Caixa de Ferramentas C 352 354 355 356 357 358 359

352

354

355

356

357

358

359

360

365

366

369

370

372

373

374

375

387

xix

conteúdo údoúdo
conteúdo
údoúdo
conteúdo údoúdo C Lab2 OpenCV Imagine se seu computador pudesse ficar de olho na sua casa,

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.

quem tem perambulado por aí. Neste lab, você criará um detector de intrusos à base de
quem tem perambulado por aí. Neste lab, você criará um detector de intrusos à base de
xx
xx
tem perambulado por aí. Neste lab, você criará um detector de intrusos à base de C

9

conteúdo

processos e chamadas de sistema

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
xxi
xxi
xxi
xxi
xxi

xxi

conteúdo

comunicação entre processos

10 Criar processos é apenas metade da história E se você

É bom conversar

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
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
kill para enviar sinais 457 Enviando uma chamada de alerta para seu código 458 Sua Caixa

11

conteúdo

sockets e redes

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
xxiii
xxiii
xxiii
xxiii
xxiii
xxiii
xxiii
xxiii

xxiii

conteúdo

12

threads

É 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

AA BB
AA
BB
conteúdo coco C Lab 3 Blasteroids Neste lab, você fará um tributo a um dos
conteúdo coco
conteúdo
coco

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!

você fará um tributo a um dos videogames mais populares e de longa vida entre todos.
fará um tributo a um dos videogames mais populares e de longa vida entre todos. Está
xxv
xxv

conteúdo

i

sobras

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.

antes de guardar este livro, leia estes acréscimos . 1. Operadores 540 2. Diretivas do pré-processador

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

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.

ii

se precisar de um lembrete. Talvez você até queira destacar estas páginas para colocar na sua

xxvi