1 Introduktion 15
1.1 Unixsystem? 16
1.2 Bokens exempelprogram 16
1.3 Andra utgåvan 17
1.4 Tredje utgåvan 18
2 Kort historia 19
2.1 Högnivåspråken utvecklas 22
2.2 Andra Unixliknande system 23
3 Installera nödvändiga verktyg 25
3.1 Navigera i de inbyggda man-sidorna 26
4 Introduktion till C 29
4.1 Ett första exempel 31
4.2 Ett exempel med indata 35
4.2.1 Första varianten 35
4.2.1.1 Spill över med flit 38
4.2.2 Andra varianten 39
4.3 Övningsuppgifter 44
5 Variabler och datatyper i C 45
5.1 Variabelnamn 46
5.2 Heltal 48
5.2.1 Portabilitet 50
5.2.2 Signed och unsigned int 52
5.2.3 Tecken, char 55
5.3 Flyttal 56
5.4 Fält av tal 57
5.5 Uppräkningstypen enum 58
5.6 Konstruktioner, struct 59
5.6.1 Storleken på konstruktioner 64
5.7 Egna datatyper med typedef 66
5.8 Unioner 70
5.9 Konstanter 73
5.10 Omvandla mellan olika typer 75
5.11 Aritmetik 77
5.11.1 Modulo-operatorn 80
5.12 Övningsuppgifter 82
6 Loopar & villkor 85
6.1 Jämförelseoperatorer 85
6.2 Olika villkorssatser i C 86
6.3 if-satsen 86
6.4 Logiska operatorer 91
6.5 Nästlade if-satser 93
6.6 Jämföra strängar 95
6.7 Switch-satsen 97
6.8 Loopar 99
6.8.1 for-loopen 99
6.8.1.1 Utesluta delar i for-loopen 103
6.8.2 while-loopen 105
6.8.3 do while 107
6.8.4 Avbryta en loop med break 108
6.8.5 Hoppa över iterationer med continue 110
6.9 Övningsuppgifter 111
7 Bitvisa operationer 113
7.1 Bitvis OCH & bitvis ELLER 113
7.1.1 Exklusiv ELLER 117
7.2 Bitvis skiftning 118
7.3 Negation 119
7.3.1 Negation och signerade heltal 120
7.4 Övningsuppgifter 121
8 Funktioner, del 1 123
8.1 En första egen funktion 125
8.2 Funktionsprototyp och funktionskropp 126
8.3 Returtyper och argument 127
8.4 Placera funktioner i separata filer 131
8.5 Övningsuppgifter 133
9 Minneshantering 135
9.1 Heap och stack 135
9.1.1 BSS, data och text 137
9.1.2 Stack frames 138
9.2 Scope 138
9.2.1 Block-scope 140
9.2.1.1 Global 142
9.2.1.2 Static 144
9.2.2 Filbaserat scope 146
9.3 Dynamisk minneshantering 148
9.4 Allting handlar om null-tecknet 153
9.5 Övningsuppgifter 159
10 Pekare 163
10.1 Adressen till teckenfält 165
10.2 Skapa pekare 167
10.3 Mer om fält, strängar och pekare 170
10.3.1 Andra typer av fält 173
10.4 Pekare till pekare 175
10.4.1 Använda pekare till pekare för fält 176
10.5 Övningsuppgifter 178
11 Funktioner, del 2 181
11.1 main() 181
11.1.1 Behandla argument till programmet 183
11.1.1.1 Förklaring av resten av simple-ls 191
11.2 Fält som argument och retur 192
11.2.1 Fält som argument 192
11.2.2 Returnera ett fält 194
11.2.3 Call by reference 196
11.3 Övningsuppgifter 197
12 Filhantering 199
12.1 Strömmar och fildeskriptorer 200
12.2 Skriva till filer med filströmmar 200
12.3 Läsa från filer med filströmmar 203
12.3.1 Läsa in specifikt innehåll 208
12.4 stdin, stdout och stderr 210
12.5 Förflytta sig i en fil 211
12.6 Skriva och läsa med fildeskriptorer 213
12.7 Skriva och läsa binärdata 215
12.7.1 Skriva och läsa en enstaka variabel 216
12.7.2 Skriva fält till en fil 218
12.7.2.1 Blanda olika datatyper 221
12.7.3 Lagra strukturer i filer 222
12.7.4 Ett komplett lagerhanteringsprogram 225
12.8 Övningsuppgifter 236
13 Introduktion till systemanrop 237
13.1 Filsystem och rättigheter 240
13.1.1 Rättigheter som oktala tal 242
13.1.2 umask 243
13.2 Två exempelprogram 245
13.2.1 Enkelt program för filinformation 245
13.2.2 Program för att ändra ägaren av en fil 246
13.3 Systemanrop, datatyper och C-standarder 248
13.4 Felhantering och errno 252
13.5 En egen version av touch 257
13.6 Många fler systemanrop 258
13.7 Övningsuppgifter 262
14 Kommunicera med skalet och andra program 265
14.1 Rörledningar 267
14.2 Returkoder 270
14.3 Omdirigera data till och från filer 271
14.3.1 Skriva till stderr i C 274
14.4 Knyta samman returkoder, rörledningar och omdirigeringar 275
14.5 Miljövariabler 279
14.5.1 Läsa och sätta miljövariabler i C 281
14.6 Övningsuppgifter 283
15 Kompilatorn, objektfiler och make 285
15.1 De fyra stegen 285
15.1.1 Preprocessorn 287
15.1.2 Kompilering 288
15.1.3 Assembly 290
15.1.4 Linker 290
15.2 Ett par nyttiga flaggor 291
15.3 Make 292
15.3.1 En Makefile för ett projekt 293
15.3.1.1 En smartare Makefile 299
15.3.1.2 Fler variabler och mål 301
15.4 Delade bibliotek 303
15.4.1 Statiska bibliotek 304
15.4.2 Dynamiska bibliotek 307
15.4.2.1 Titta i det dynamiska biblioteket 308
15.4.2.2 Installera biblioteket i systemet 309
15.4.2.3 Använda biblioteket i ett program 310
15.4.2.4 macOS 311
15.4.2.5 Använda tredjepartsbibliotek 314
15.5 Övningsuppgifter 314
16 Processer, demoner, barn och föräldrar 317
16.1 Introduktion till exec() 323
16.2 Introduktion till fork() 325
16.2.1 Zombie-processer 329
16.3 system() 331
16.4 Demoner 332
16.5 Övningsuppgifter 335
17 IPC 339
17.1 Signalhantering 340
17.1.1 Utöka demonen med signalhanterare 341
17.1.1.1 Utöka med ytterligare signalhanterare 346
17.1.1.2 Utöka med ett klientprogram 350
17.2 Pipes (rörledningar) 352
17.3 FIFO (namngivna rörledningar) 354
17.3.1 C och FIFO 357
17.4 Meddelandeköer 361
17.5 Unix-sockets 367
17.5.1 En tidsserver över en Unix-socket 368
17.5.2 Klient till tidsservern 372
17.6 Övningsuppgifter 373
18 TCP/IP 375
18.1 Server/klient med UDP 375
18.1.1 Serverprogrammet 376
18.1.2 Klientprogrammet 380
18.2 Server/klient med TCP 383
18.2.1 Serverprogrammet 383
18.2.2 Klientprogrammet 387
18.3 Namnuppslagning 390
19 Felsökning 393
19.1 GDB och LLDB 394
19.1.1 Installera GDB / LLDB 395
19.1.2 Stega igenom ett enkelt program 395
19.1.3 Övervaka variabler 399
19.1.4 Modifiera variabler under körning 402
19.1.5 Program med flera funktioner och argument 402
19.1.6 Titta i minnesadresser 405
19.1.7 Undersöka minnet på djupet 407
19.1.8 Felsöka barnprocesser 410
19.1.8.1 GDB 411
19.1.8.2 LLDB 412
19.2 Valgrind 412
19.2.1 Installera Valgrind 412
19.2.2 Använda Valgrind 415
19.2.3 Mer svårupptäckta minnesproblem 419
19.3 Övningsuppgifter 423
20 Avslutning 425
Appendix A (ASCII-tabell) 427
Appendix B (Talsystem) 433
Bitar, bytes och det binära talsystemet 433
Omvandla mellan binärt och decimalt 434
Signerade tal 435
Hexadecimala talsystemet 436
Till och från binärt 437
Hexadecimalt till decimalt 439
Räkna ut större och mer komplicerade tal 442
Oktala talsystemet 442
Till och från binärt 443
Oktalt till decimalt 444
Använda bc för att omvandla mellan olika talsystem 447
Källor 449