Это одна из моих любимых цитат Денниса Ричи, с которой я полностью согласен. Первым языком программирования, который я выучил, был C еще в аспирантуре. Да, профессора преподают C как первый язык программирования в школах. Среда обучения настолько нелепа, что мы не знаем цели #include‹stdio.h›. Все, что мы знаем, это строки, которые включены в начало программы. Некоторые профессора хотели бы преподавать эффективно, приводя больше примеров в реальном времени, но они ограничены своим расписанием и временными ограничениями.

Моей первой программой на C была программа «Hello World». Это простая программа, которую каждый студент начинает изучать программирование. Вот так я тоже начал кодить. Позже я изучил типы данных, переменные, массивы, функции, указатели, структуры, объединения и так далее. Теоретически все эти концепции были хороши, но я никогда не понимал их назначения. «Что главное? , что такое пустота? , Каковы возвращаемые значения?» Вот вопросы, которые крутятся у меня в голове. Новичку довольно сложно понять концепции и их применение. В какой-то момент я подумал: «Почему меня учат сумме двух целых чисел, рядам Фибоначчи, простым числам, если я не использую их ни в каких приложениях реального времени». Это основные программы, которые помогают понять концепции циклов, условий и т. д. Эти программы помогают развивать наши логические навыки и навыки решения проблем, которые создают основу для решения некоторых сложных задач.

Позже, когда я перешел к продвинутым концепциям C, таким как многопоточность, мне было трудно их переварить, но, тем не менее, мне удалось сдать экзамен с отличием. Именно во время учебы в магистратуре я осознал важность концепций многопоточности, без которых ни одно приложение не будет эффективным.

Именно благодаря этим двум проектам я изучил продвинутые концепции C. Моим первым заданием было разработать собственную оболочку, в которой мы могли бы выполнять простые команды Linux, считывать файл и некоторые слова из командной строки и проверять, соответствуют ли слова присутствуют в данном входном файле. Мы должны реализовать это с помощью каналов. Ahhh pipe, простой способ связи между родительским и дочерним процессами.

Это мой собственный интерпретатор оболочки, который работает до тех пор, пока не будет использована команда «exit».

Сначала потребовалось некоторое время, чтобы понять концепции IPC, каналов, fork(), параллельного программирования и их синхронизации. Позже, когда я начал работать над этим проектом, я узнал, как процесс взаимодействует с другим процессом с помощью пайпов, что происходит при вызове fork(), как перенаправить из stdin/stdout в пайпы. Дочерний процесс запускается при вызове fork(). Я использовал дочерний процесс для выполнения команд с помощью системного вызова execvp(). Родительский процесс ожидает завершения дочернего процесса с помощью системного вызова wait().

Хотя мой проект не был успешным, я доволен уровнем понимания.

Мой второй проект заключался в реализации протокола информации о маршрутизации, в котором 21 маршрутизатор взаимодействует друг с другом и создает свои собственные таблицы маршрутизации. По сути, мы начали с 7 маршрутизаторов, чтобы убедиться, что наша программа работает нормально. Наша первая проблема заключалась в том, как мы можем определить таблицу с 3 столбцами (dest_id, ссылка, стоимость) в C, мы начали изучать все доступные типы данных. Мы столкнулись со структурами в C, которые представляют собой набор различных элементов данных. Поскольку нам нужно хранить 3 разных элемента данных в одном блоке памяти, мы думали, что структуры сделают это за нас. Затем мы инициализировали все таблицы локальными значениями и их соседними узлами. Мы использовали pthreads, чтобы сделать его многопоточным приложением. Чтобы добиться синхронизации, мы изучили концепции блокировок мьютексов.

Наконец, мы преобразовали алгоритм в код. В нем есть некоторые ошибки, но нам понравилось, пока мы программировали.

Что я узнал из своих двух неудачных проектов C:

  • Как родительский и дочерний процессы взаимодействуют друг с другом с помощью методов IPC.
  • Некоторые системные вызовы вроде fork(), execvp().
  • Работа параллельной программы и синхронизация потоков.
  • Многопоточное приложение с использованием pthreads и mutex для блокировки и разблокировки.

Я предлагаю своим сокурсникам делать все больше и больше вещей, чтобы понять концепции любого языка программирования.

Это мой первый пост в блоге. Спасибо за чтение и отзывы приветствуются.

Удачного кодирования