2010-06-01 7 views
43

Nach fünf Jahren professioneller Java (und in geringerem Maße auch Python) Programmierung und langsamem Gefühl, dass meine CS-Ausbildung nachlässt, beschloss ich, meinen Horizont/allgemeinen Nutzen für die Welt zu erweitern und etwas zu tun, das mehr (für mich) fühlt) Ich habe wirklich Einfluss auf die Maschine. Ich habe mich für C- und Unix-Programmierung entschieden, da ich glaube, dass viele der interessantesten Probleme darin bestehen.So üben Sie Unix-Programmierung in C?

Mein Endziel ist es, dies beruflich zu machen, nur aus dem Grund, dass ich 40-50 Stunden pro Woche für die Arbeit aufwenden muss, die die Rechnungen bezahlt, so kann es auch sein Art der Codierung möchte ich besser werden. Natürlich wirst du nicht angeheuert, Dinge zu tun, die du vorher nicht getan hast, also mache ich jetzt selbstständig.

Zu diesem Zweck begann ich mit K & R, die eine große Ressource teilweise aufgrund der Übungen in jedem Kapitel verteilt war. Danach ging ich weiter zu Computer Systems: A Programmer's Perspective, gefolgt von zehn Kapiteln von Advanced Programming in the Unix Environment. Wenn ich mit diesem Buch fertig bin, lese ich Unix Network Programming.

Was ich in den Stevens-Büchern vermisse, ist das Fehlen von Programmierproblemen; Sie dokumentieren hauptsächlich die Funktionalität und liefern Beispiele mit ein paar Fragen zum Ende des Kapitels. Ich fühle, dass ich viel mehr von der Herausforderung profitieren würde, das Wissen in jedem Kapitel zu verwenden. Ich könnte ein Testprogramm für jede Funktion schreiben, aber dies ist eine weniger wünschenswerte Methode, da (1) ich wahrscheinlich weniger motiviert wäre als wenn ich mich einer äußeren Herausforderung stellen würde, und (2) werde ich natürlich nur daran denken, die Funktion auf die Weise zu benutzen, die mir bereits eingefallen ist.

Also, würde ich gerne einige Empfehlungen bekommen, wie man übt. Offensichtlich wäre meine erste Wahl, eine Ressource zu finden, die Unix-Programmieraufgaben hat. Ich habe auch darüber nachgedacht, einen Beitrag zu einem Open-Source-C-Projekt zu leisten und zu versuchen, aber das ist etwas entmutigend, da es einen gewissen Overhead beim Lernen der Software geben würde, um dann die Codebasis zu lernen. Das einzige Open-Source-C-Projekt, an das ich denken kann, ist Python, und ich bin mir nicht sicher, wie leicht es wäre, damit anzufangen.

Das heißt, ich bin offen für alle möglichen Vorschläge, da es wahrscheinlich Dinge gibt, an die ich nicht einmal gedacht habe.

+5

Ich möchte nur sagen, ich liebe es, solche Beiträge zu sehen, in denen du nicht einfach sagst: "Wie lerne ich C, habe aber gar nichts alleine gemacht?" Kudos. Upvote. – samoz

+3

Lesen Sie zuerst: http://stackoverflow.com/search?q=code+kata. Zweitens, aktualisieren Sie Ihre Frage, damit sie nicht bereits beantwortet wird. Oder, möglicherweise, schließen Sie diese Frage, weil es ein Duplikat von einem oder mehreren von denen ist. –

+3

Ich stimme nicht mit S.Lott überein, er sucht keine Anfängereinführung wie die meisten anderen Fragen. Sein Hintergrund ist anders und verdient ein anderes Thema und Antworten. – samoz

Antwort

24

Erfinden Sie viele der wichtigsten Unix-Utilities neu. Die meisten von ihnen waren (und sind immer noch) in C geschrieben, also sind sie ein guter Weg, um mit dem Lernen zu beginnen. Abhängig von Ihrer Fähigkeit wählen Sie härtere oder einfachere Werkzeuge zum Kopieren aus.

Versuchen Sie, Ihr eigenes malloc zu schreiben. Sie werden viel über Unix und viel C-Programmierung lernen.

Google für CS Betriebssystemkurse und die Projekte dort tun. Viele Schulen haben diese Projekte auf öffentlichen Websites, so dass Sie alles bekommen können, was Sie brauchen. Here ist ein Link zu Purdues Website. Geben Sie dem Shell-Projekt eine Chance, es war schwierig, aber sehr lehrreich.

+0

Ich zweite, ich habe ähnliche Dinge getan, um mich neue Fähigkeiten zu lehren. Die persönliche Erfahrung war die Neuimplementierung eines Kerneltreibers für ein einfaches Hardwaregerät unter Linux. – andy

+0

+1, eine Reihe von Kern-Utilities zu schreiben wäre eine hervorragende Herausforderung, die schnell praktische Früchte tragen würde. –

+0

Ich mag diese Antwort sehr; vor allem die Idee, OS-Projekte auf Kursseiten zu finden. Daran hatte ich nicht gedacht. – danben

5

Hier sind ein paar Stackoverflow-Beiträge, die C/Unix-Programmierbücher behandeln. Ihr Hauptanspruch auf Ruhm ist eine umfangreiche Fan-out-Verbindung zu anderen Ressourcen.

Üben Sie einige der Idiome (verstehen Sie die Vor- und Nachteile von Zeigern usw.) und wählen Sie Projekte, die dabei helfen. Der dritte Punkt in der Liste hat eine Antwort (Disclaimer, ich habe es geschrieben) mit einer Reihe von C-Idiomen auf hohem Niveau, bei denen ein idiomatisches C-Programm von Java abweichen würde. Das Lernen von XLib oder Win32 GUI-Programmierung mit C ist wahrscheinlich weniger nützlich, da fast alles besser ist als C für die GUI-Programmierung und das Umhüllen einer Kern-C-Engine mit einer anderen Sprache ist im Allgemeinen viel einfacher - es sei denn, Sie sind wirklich mit Geschwindigkeit beschäftigt.Konzentrieren Sie sich als Ausgangspunkt auf "System" -Programmieranwendungen, wo Sie wahrscheinlich am ehesten von C profitieren. Erfahren Sie, wie die C-Schnittstelle einer der Skriptsprachen wie Tcl oder Python funktioniert.

Das Schreiben von Bit-Twiddly- und Pointer-Schwercode (z. B. das Aufteilen von Netzwerkpaketen oder das Interpretieren eines Protokolls) oder serverseitige Elemente mit Sockets führt Sie direkt in die Kernkompetenzen von C. Wenn Sie einige der WRS-Bücher haben, versuchen Sie, pthreads zu arbeiten (IIRC UNP2 hat einen großen Abschnitt über pThreads). Schreiben Sie für einen Kontrast etwas, das nicht blockierende E/A verwendet. Dieses Zeug ist das Zuhause von C und du wirst ein gutes Arbeitswissen über C bekommen, wenn du das tust. Troll durch die RFCs für einige Ideen von Netzwerkprotokollen zu implementieren.

+0

Danke für die Antwort! Die Links sind nicht sehr nützlich, weil: (1) eher auf Linux-Benutzer als auf Entwickler ausgerichtet ist, (2 und 3) auf fortgeschrittenes C, was ich tun muss, aber nicht nach SO fragen muss, und (4 und 5) handelt von Datenstrukturen und Algorithmen, mit denen ich einen soliden Hintergrund habe. Ich denke jedoch, dass Ihre Vorschläge für Projekte sehr gut sind - vielleicht ist das Lernen der Python-API der richtige Weg. – danben

0

Der beste Weg, um Ihre Erkenntnisse es zu konsolidieren zu üben. Wählen Sie einfach eine Art von Anwendung, die Sie interessiert und beginnen Sie mit der Entwicklung (z. B. eine einfache cli/server App für das Netzwerk). Versuchen Sie, die meisten Unix-APIs (Dateien, Sockets usw.) zu testen, um zu sehen, wie es funktioniert. Sie könnten zum Beispiel ein Unix-Programmierbuch bekommen, seinen Kapiteln folgen und Ihre Anwendung testen, indem Sie Ihre eigenen Funktionen erstellen. Auf diese Weise können Sie beginnen, eine eigene Funktionsbibliothek für weitere Projekte zu entwickeln.

0

Schreiben Sie einen Webserver.

  • Machen Sie es multi-threaded.

  • Haben sie eine neue Skriptsprache unterstützen Sie entwickeln (a la PHP, etc.)

  • von authentifizierten Benutzern erlauben Uploads.

  • Schreiben Sie ein Plugin für Ihr Lieblingswerkzeug (zB. Integration mit SVN, um ein Webview zu geben).

1

Sind Sie offen für Buchvorschläge? Obwohl es ein bisschen veraltet ist (wo "ein bisschen" vielleicht eine große Untertreibung ist), ist Maurice Bachs "Das Design des Unix-Betriebssystems" ein großartiges Buch. Es gehört neben K & R auf Ihrem Bücherregal.

1

Sie könnten versuchen, sich durch alle Beispiele im Buch Software Tools (Amazon) zu arbeiten. Vieles davon ist ziemlich fussgängerisch (rechtsextremer Text, de-tabify, usw.), aber es ist eine großartige Einführung in die Unix-Philosophie und grundlegende C-Programmierung.

1

Das ist ziemlich interessant. Da wir wissen, dass Unix unter Verwendung der Sprache C entwickelt wurde, ist es nicht schwer zu lernen. Wenn Sie Windows OS verwenden, können Sie mit der Anwendung "Windows-Dienste für Unix" Ihre Programme üben. Wenn Sie Unix verwenden, können wir Editoren wie vi verwenden.

0

Ich würde eine Sache sehr empfehlen.

Versuchen Sie und schreiben Sie alle üblichen Linux-Kommandozeilen-Tools wie ls, mkdir, cd usw.

Sie erhalten viel Wissen über Programmierung und Linux gleichzeitig.

Wählen Sie die Befehle vom einfachsten, sagen Sie "Zeit" und arbeiten Sie bis zu den komplizierteren.