Как я использую программирование Unix в C?

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Какие хорошие книги Linux / Unix для продвинутого пользователя?
  • Каковы некоторые хорошие ресурсы для обучения C за пределами K & R
  • Ресурсы для обучения программе C
  • Каков хороший способ начать изучение структуры данных и алгоритмов?
  • Алгоритмы в C

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

Вы можете попробовать проработать все примеры в книге Software Tools (Amazon). Большая часть из них довольно пешеходная (право-обосновать текст, де-tabify и т. Д.), Но это отличное введение в философию Unix и базовое программирование на C.

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

Я бы порекомендовал одно.

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

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

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

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

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

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

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

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

  • Разрешить загрузку от пользователей, прошедших проверку подлинности.

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