Как я практикую программирование Unix на C? - PullRequest
48 голосов
/ 01 июня 2010

После пяти лет профессионального программирования на Java (и, в меньшей степени, на Python) и медленного ощущения, что мое образование в области компьютерных наук ускользает, я решил, что хочу расширить свой кругозор / общую полезность для мира и сделать что-то, что чувствует больше ( мне) как будто я действительно влияю на машину. Я решил изучать программирование на C и Unix, так как я чувствую, что именно здесь находятся многие из наиболее интересных проблем.

Моя конечная цель - сделать это профессионально, если только по той причине, что мне приходится тратить 40-50 часов в неделю на работу, которая оплачивает счета, так что это также может быть типом кодирования, в котором я хочу стать лучше Конечно, вас не нанимают делать то, чего вы раньше не делали, поэтому сейчас я наращиваю себя самостоятельно.

С этой целью я начал с K & R, который был отличным ресурсом отчасти благодаря упражнениям, разбросанным по каждой главе. После этого я перешел к Компьютерные системы: перспектива программиста , а затем десять глав Расширенное программирование в среде Unix . Когда я закончу с этой книгой, я прочитаю Сетевое программирование Unix .

Что мне не хватает в книгах Стивенса, так это отсутствие проблем программирования; они в основном документируют функциональность и предоставляют примеры, а также несколько вопросов в конце главы. Я чувствую, что мне было бы гораздо полезнее, если бы мне пришлось использовать знания в каждой главе а-ля K & R. Я мог бы написать несколько тестовых программ для каждой функции, но это менее желательный метод, так как (1) я, вероятно, был бы менее мотивирован, чем если бы я столкнулся с каким-то внешним вызовом, и (2) я, естественно, буду думать только об использовании функции способами, которые уже произошли со мной.

Итак, я хотел бы получить некоторые рекомендации о том, как практиковать. Очевидно, что мой первый выбор - найти какой-то ресурс, имеющий проблемы с программированием на Unix. Я также подумал о том, чтобы найти и попытаться внести свой вклад в какой-то проект C с открытым исходным кодом, но это немного утомительно, так как могут возникнуть некоторые трудности в изучении использования программного обеспечения, а затем в изучении кодовой базы. Единственный проект C с открытым исходным кодом, о котором я часто вспоминаю, - это Python, и я не уверен, насколько легко начать работу.

Тем не менее, я открыт для всевозможных предложений, поскольку есть вероятные вещи, о которых я даже не подумал.

Ответы [ 8 ]

28 голосов
/ 01 июня 2010

Переосмыслите множество основных утилит Unix. Большинство из них были (и остаются) написаны на C, так что это хороший способ начать обучение. В зависимости от ваших навыков выбирайте более сложные или более простые утилиты для копирования.

Попробуйте написать свой собственный malloc. Вы узнаете много нового о Unix, а также о программировании на C.

Google для курсов по информатике операционной системы и делать проекты там. Во многих школах такие проекты размещены на общедоступных веб-сайтах, чтобы вы могли получить все, что вам нужно. Здесь - ссылка на сайт Пердью. Дайте проекту оболочки шанс; это было сложно, но по-настоящему познавательно.

5 голосов
/ 01 июня 2010

Вот несколько публикаций, посвященных стековому потоку и обсуждающих книги по программированию на C / Unix. Их главная претензия на известность - обширное распространение других ресурсов.

Попрактикуйтесь в некоторых идиомах (разберитесь с тонкостями указателей и т. Д.) И выберите проекты, которые помогут с этим. Третий пункт в списке содержит ответ (отказ от ответственности, я его написал) с набором высокоуровневых идиом C, в которых идиоматическая C-программа будет отличаться от Java.

Изучение программирования на XLib или Win32 с использованием графического интерфейса пользователя на C, вероятно, менее полезно, так как почти все лучше, чем C для программирования GUI, и перенос ядра ядра C на другой язык, как правило, намного проще - если вы действительно не беспокоитесь о скорости. В качестве отправной точки сконцентрируйтесь на «системных» приложениях для программирования, где вы, скорее всего, получите реальную выгоду от C. Узнайте, как работает интерфейс C одного из языков сценариев, таких как Tcl или Python.

Написание некоторого битового кода и тяжелого указателя кода (например, разбор сетевых пакетов или интерпретация протокола) или элементов на стороне сервера с использованием сокетов перенесет вас прямо в сферу компетенции C. Если у вас есть некоторые книги по WRS, попробуйте заставить работать pthreads (IIRC UNP2 содержит большой раздел о pThreads). Для контраста напишите что-нибудь, что использует неблокирующий ввод / вывод. Этот материал - домашний газон C, и вы получите хорошие рабочие знания C, сделав это. Пролистайте RFC, чтобы найти идеи для реализации сетевых протоколов.

1 голос
/ 03 марта 2011

Это довольно интересно. Поскольку мы знаем, что Unix разработан с использованием языка Си, его, возможно, нетрудно выучить. Если вы используете ОС Windows, вы можете использовать приложение «Службы Windows для Unix», чтобы практиковать свои программы. Если вы используете Unix, то мы можем использовать редакторы, такие как vi .

1 голос
/ 01 июня 2010

Вы можете попробовать пройтись по всем примерам в книге Программные средства (Amazon). Во многом это довольно пешеходно (выравнивание текста по правому краю, удаление таблиц и т. Д.), Но это отличное введение в философию Unix и базовое программирование на Си.

1 голос
/ 01 июня 2010

Вы открыты для предложений книг? Хотя это немного устарело (где «немного», возможно, является огромным преуменьшением), книга Мориса Баха «Дизайн операционной системы Unix» - отличная книга. Он стоит рядом с K & R на вашей книжной полке.

0 голосов
/ 05 июля 2016

Я бы очень рекомендовал одну вещь.

Попробуйте переписать все обычные инструменты командной строки Linux, такие как ls, mkdir, cd и т. Д.

Вы получите много знаний опрограммирование и Linux одновременно.

Выберите команды из самых простых, скажем, "время" и работайте вплоть до более сложных.

0 голосов
/ 01 июня 2010

Написать веб-сервер.

  • Сделать его многопоточным.

  • Поддерживает ли он новый язык сценариев, который вы разрабатываете (например, PHP и т. Д.)

  • Разрешить загрузку от аутентифицированных пользователей.

  • Напишите плагин для вашего любимого инструмента (т. Е. Интегрируйте с SVN, чтобы создать веб-просмотр).

0 голосов
/ 01 июня 2010

Лучший способ закрепить ваши знания на практике. Поэтому просто выберите интересующее вас приложение и начните его разработку (например, простое сетевое приложение клиент / сервер).

Попробуйте протестировать большинство API Unix (файлы, сокеты и т. Д.), Чтобы увидеть, как они работают. Например, вы можете получить книгу по программированию для Unix, следовать ее главам и протестировать в своем приложении все, что вы читаете, создав собственные функции. Таким образом, вы можете начать разработку собственной библиотеки функций, которая будет использоваться в дальнейших проектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...