Hoe oefen ik Unix-programmering in C?

Na vijf jaar professioneel Java (en in mindere mate Python) programmeren en langzaam het gevoel hebben dat mijn computerwetenschappelijke opleiding wegglipte, besloot ik dat ik mijn horizon/algemene bruikbaarheid voor de wereld wilde verbreden en iets wilde doen dat meer voelt ( voor mij) alsof ik echt invloed heb op de machine. Ik heb ervoor gekozen om C- en Unix-programmering te leren, omdat ik denk dat daar veel van de meest interessante problemen zitten.

Mijn einddoel is om dit professioneel te kunnen doen, al is het maar om het feit dat ik 40-50 uur per week moet besteden aan werk dat de rekeningen betaalt, dus het kan net zo goed het type zijn van coderen waar ik beter in wil worden. Natuurlijk word je niet ingehuurd om dingen te doen die je nog niet eerder hebt gedaan, dus voor nu ga ik alleen verder.

Hiervoor ben ik begonnen met K&R, wat een geweldige hulpbron was, deels vanwege de oefeningen die in elk hoofdstuk waren verspreid. Daarna ging ik verder met Computersystemen: het perspectief van een programmeur, gevolgd door tien hoofdstukken van Geavanceerd programmeren in de Unix-omgeving. Als ik klaar ben met dit boek, lees ik Unix Network Programming.

Wat ik mis in de boeken van Stevens is het ontbreken van programmeerproblemen; ze documenteren voornamelijk functionaliteit en geven voorbeelden, met enkele vragen aan het einde van het hoofdstuk. Ik denk dat ik er veel meer baat bij zou hebben om uitgedaagd te worden om de kennis in elk hoofdstuk a la K&R te gebruiken. Ik zou voor elke functie een of ander testprogramma kunnen schrijven, maar dit is een minder wenselijke methode omdat (1) ik waarschijnlijk minder gemotiveerd zou zijn dan wanneer ik een externe uitdaging zou aangaan, en (2) ik natuurlijk alleen maar zal denken om de functie te gebruiken op de manieren die al bij me zijn opgekomen.

Dus ik zou graag wat aanbevelingen willen krijgen over hoe te oefenen. Het is duidelijk dat mijn eerste keuze zou zijn om een ​​bron te vinden met Unix-programmeeruitdagingen. Ik heb ook overwogen om een ​​open source C-project te vinden en eraan bij te dragen, maar dit is een beetje ontmoedigend omdat er wat overhead zou zijn bij het leren gebruiken van de software en vervolgens het leren van de codebase. Het enige open-source C-project dat ik kan bedenken dat ik regelmatig gebruik, is Python, en ik weet niet zeker hoe gemakkelijk dat zou zijn om mee te beginnen.

Dat gezegd hebbende, sta ik open voor allerlei suggesties, omdat er waarschijnlijk dingen zijn waar ik nog niet eens aan heb gedacht.


Antwoord 1, autoriteit 100%

Vind veel van de belangrijkste Unix-hulpprogramma’s opnieuw uit. De meeste hiervan waren (en zijn nog steeds) geschreven in C, dus ze zijn een goede manier om te beginnen met leren. Kies, afhankelijk van je vaardigheden, moeilijkere of gemakkelijkere hulpprogramma’s om te kopiëren.

Probeer je eigen malloc te schrijven. Je leert veel over Unix en ook veel over C-programmering.

Google voor cursussen over besturingssystemen voor computerwetenschappen en voer de projecten daar uit. Veel scholen hebben deze projecten op openbare websites, zodat je alles kunt krijgen wat je nodig hebt. Hieris een link naar de site van Purdue. Geef het shell-project een kans; het was moeilijk, maar erg leerzaam.


Antwoord 2, autoriteit 17%

Hier zijn een paar stackoverflow-posts waarin C/Unix-programmeerboeken worden besproken. Hun belangrijkste claim op roem is de uitgebreide fan-out naar andere bronnen.

Oefen enkele van de idiomen (begrijp de ins en outs van pointers enz.) en kies projecten die daarbij helpen. Het derde item in de lijst heeft een antwoord (disclaimer, ik heb het geschreven) met een heleboel C-idioom op hoog niveau waar een idiomatisch C-programma zou verschillen van Java.

Het leren van XLib- of Win32 GUI-programmering met C is waarschijnlijk minder nuttig, aangezien bijna alles beter is dan C voor GUI-programmering en het inpakken van een core C-engine met een andere taal over het algemeen veel gemakkelijker is – tenzij u zich echt zorgen maakt over snelheid. Concentreer je om te beginnen op ‘systeem’-programmeertoepassingen, waar je de meeste kans maakt om echte kilometers te maken met C. Leer hoe de C-interface van een van de scripttalen zoals Tcl of Python werkt.

Het schrijven van een beetje onduidelijke en pointer-zware code (bijvoorbeeld het uit elkaar halen van netwerkpakketten of het interpreteren van een protocol), of server-side items met behulp van sockets, brengt je rechtstreeks naar de kerncompetenties van C. Als je een aantal van de WRS-boeken hebt, probeer dan pthreads te laten werken (IIRC UNP2 heeft een groot gedeelte over pThreads). Schrijf voor een contrast iets dat niet-blokkerende I/O gebruikt. Dit spul is de thuisbasis van C en je krijgt een goede praktische kennis van C door dit te doen. Trol door de RFC’s voor enkele ideeën over te implementeren netwerkprotocollen.


Antwoord 3, autoriteit 3%

Staat u open voor suggesties voor boeken? Hoewel het een beetje gedateerd is (waar “een beetje” misschien een enorm understatement is), is “The Design of the Unix Operating System” van Maurice Bach een geweldig boek. Het hoort naast K&R op je boekenplank.


Antwoord 4, autoriteit 3%

U kunt proberen alle voorbeelden in het boek Softwaretools(Amazone). Veel ervan is vrij eenvoudig (tekst rechts uitvullen, tabs verwijderen, enz.), maar het is een geweldige introductie tot de Unix-filosofie en basis C-programmering.


Antwoord 5, autoriteit 3%

Dit is best interessant. Omdat we weten dat Unix is ​​ontworpen met behulp van de C-taal, is het misschien niet moeilijk om te leren. Als u het Windows-besturingssysteem gebruikt, kunt u een toepassing “Windows-services voor Unix” gebruiken om uw programma’s te oefenen. Als je Unix gebruikt, kunnen we editors gebruiken zoals vi.


Antwoord 6

Ik zou één ding ten zeerste aanbevelen.

Probeer en herschrijf alle gebruikelijke Linux-hulpprogramma’s voor opdrachtregels, zoals ls, mkdir, cd enz.

Je zult tegelijkertijd veel kennis opdoen over programmeren en Linux.

Kies de gemakkelijkste commando’s, zeg “tijd” en werk helemaal naar de meer gecompliceerde.


Antwoord 7

De beste manier om je lessen te consolideren om te oefenen. Kies dus gewoon een soort applicatie die u interesseert en begin deze te ontwikkelen (bijvoorbeeld een eenvoudige netwerkclient/server-applicatie).

Probeer de meeste Unix API’s (bestanden, sockets, enz.) te testen om te zien hoe ze werken. U kunt bijvoorbeeld een Unix-programmeerboek krijgen, de hoofdstukken ervan volgen en alles wat u leest in uw toepassing testen door uw eigen functies te creëren. Op die manier kunt u beginnen met het ontwikkelen van uw eigen functiebibliotheek die in verdere projecten kan worden gebruikt.


Antwoord 8

Schrijf een webserver.

  • Maak het multi-threaded.

  • Zorg ervoor dat het een nieuwe scripttaal ondersteunt die u ontwikkelt (a la PHP, enz.)

  • Uploads van geverifieerde gebruikers toestaan.

  • Schrijf een plug-in voor uw favoriete tool (d.w.z. integreer met SVN om een ​​webweergave te geven).

Other episodes