1 Introduktion 15 1.1 UNIX-system? 16 1.2 Bokens exempelprogram 16 1.3 Andra utgåvan 17 2 Kort historia 19 2.1 Högnivåspråken utvecklas 22 2.2 Andra UNIX-liknande system 22 3 Installera nödvändiga verktyg 25 3.1 Navigera i de inbygga 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 53 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 72 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 104 6.8.3 do while 106 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 118 7.2 Bitvis skiftning 118 7.3 Negation 119 7.4 Övningsuppgifter 120 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 175 10.5 Övningsuppgifter 178 11 Funktioner, del 2 179 11.1 main() 179 11.1.1 Behandla argument till programmet 181 11.1.1.1 Förklaring av resten av simple-ls 189 11.2 Fält som argument och retur 190 11.2.1 Fält som argument 190 11.2.2 Returnera ett fält 192 11.2.3 Call by reference 194 11.3 Övningsuppgifter 195 12 Filhantering 197 12.1 Strömmar och ldeskriptorer 198 12.2 Skriva till filer med filströmmar 198 12.3 Läsa från filer med filströmmar 201 12.3.1 Läsa in specifkt innehåll 207 12.4 stdin, stdout och stderr 208 12.5 Förflytta sig i en fil 210 12.6 Skriva och läsa med fildeskriptorer 211 12.7 Skriva och läsa binärdata 213 12.7.1 Skriva och läsa en enstaka variabel 214 12.7.2 Skriva fält till en fil 216 12.7.2.1 Blanda olika datatyper 219 12.7.3 Lagra strukturer i filer 220 12.7.4 Ett komplett lagerhanteringsprogram 223 12.8 Övningsuppgifter 234 13 Introduktion till systemanrop 235 13.1 Filsystem och rättigheter 238 13.1.1 Rättigheter som oktala tal 240 13.1.2 umask 241 13.2 Två exempelprogram 243 13.2.1 Enkelt program för filinformation 243 13.2.2 Program för att ändra ägaren av en fil 244 13.3 Systemanrop, datatyper och C-standarder 246 13.4 Felhantering och errno 249 13.5 En egen version av touch 254 13.6 Många fler systemanrop 255 13.7 Övningsuppgifter 260 14 Kommunicera med skalet och andra program 263 14.1 Rörledningar 265 14.2 Returkoder 268 14.3 Omdirigera data till och från filer 269 14.3.1 Skriva till stderr i C 272 14.4 Knyta samman returkoder, rörledningar och omdir273 14.5 Miljövariabler 277 14.5.1 Läsa och sätta miljövariabler i C 279 14.6 Övningsuppgifter 281 15 Kompilatorn, objektfiler och make 283 15.1 De fyra stegen 283 15.1.1 Preprocessorn 285 15.1.2 Kompilering 286 15.1.3 Assembly 288 15.1.4 Linker 288 15.2 Ett par nyttiga flaggor 289 15.3 Make 290 15.3.1 En Makefile för ett projekt 291 15.3.1.1 En smartare Makefile 297 15.3.1.2 Fler variabler och mål 299 15.4 Delade bibliotek 301 15.4.1 Statiska bibliotek 302 15.4.2 Dynamiska bibliotek 305 15.4.2.1 Titta i det dynamiska biblioteket 306 15.4.2.2 Installera biblioteket i systemet 307 15.4.2.3 Använda biblioteket i ett program 308 15.4.2.4 macOS 309 15.4.2.5 Använda tredjepartsbibliotek 312 15.5 Övningsuppgifter 312 16 Processer, demoner, barn och föräldrar 315 16.1 Introduktion till exec() 321 16.2 Introduktion till fork() 323 16.2.1 Zombie-processer 327 16.3 system() 329 16.4 Demoner 330 16.5 Övningsuppgifter 333 17 IPC 337 17.1 Signalhantering 338 17.1.1 Utöka demonen med signalhanterare 339 17.1.1.1 Utöka med ytterligare signalhantera343 17.1.1.2 Utöka med ett klientprogram 347 17.2 Pipes (rörledningar) 350 17.3 FIFO (namngivna rörledningar) 351 17.3.1 C och FIFO 355 17.4 Meddelandeköer 358 17.5 Övningsuppgifter 364 18 Felsökning 367 18.1 GDB och LLDB 368 18.1.1 Installera GDB / LLDB 369 18.1.2 Stega igenom ett enkelt program 369 18.1.3 Övervaka variabler 373 18.1.4 Modifiera variabler under körning 376 18.1.5 Program med flera funktioner och argument376 18.1.6 Titta i minnesadresser 379 18.1.7 Undersöka minnet på djupet 381 18.1.8 Felsöka barnprocesser 384 18.1.8.1 GDB. 385 18.1.8.2 LLDB 386 18.2 Valgrind 389 18.2.1 Installera Valgrind 389 18.2.2 Använda Valgrind 391 18.2.3 Mer svårupptäckta minnesproblem 395 18.3 Övningsuppgifter 399 19 Avslutning 401 Appendix A (ASCII-tabell) 403 Appendix B (Talsystem) 409 Bitar, bytes och det binära talsystemet 409 Omvandla mellan binärt och decimalt 411 Hexadecimala talsystemet 412 Till och från binärt 413 Hexadecimalt till decimalt 414 Räkna ut större och mer komplicerade tal 418 Oktala talsystemet 418 Till och från binärt 419 Oktalt till decimalt 420 Källor 423