【问题标题】:How do I practice Unix programming in C?如何在 C 中练习 Unix 编程?
【发布时间】:2011-02-26 08:58:33
【问题描述】:

经过五年的专业 Java(以及在较小程度上是 Python)编程并慢慢感觉我的计算机科学教育逐渐消失,我决定要拓宽我的视野/对世界的一般有用性并做一些感觉更多的事情(对我来说)就像我真的对机器有影响一样。我选择学习 C 和 Unix 编程,因为我觉得这是许多最有趣的问题所在。

我的最终目标是能够专业地做到这一点,如果没有其他原因,除了我每周必须花费 40-50 小时来支付账单的工作,所以它也可能是类型我想变得更好的编码。当然,你不会被雇来做你以前没有做过的事情,所以现在我要靠自己的努力。

为此,我从 K&R 开始,这是一个很好的资源,部分原因是每一章都有练习。之后我转到Computer Systems: A Programmer's Perspective,然后是Advanced Programming in the Unix Environment 的十章。当我读完这本书时,我会阅读Unix Network Programming

我在 Stevens 的书中缺少的是没有编程问题;它们主要记录功能并提供示例,随后是一些章末问题。我觉得我会从被挑战使用每一章中的知识中获益更多,就像 K&R 一样。我可以为每个函数编写一些测试程序,但这是一个不太理想的方法,因为(1)我可能会比我遇到一些外部挑战时更没有动力,并且(2)我自然只会考虑使用该函数以我已经想到的方式。

所以,我想获得一些关于如何练习的建议。显然,我的第一选择是寻找一些有 Unix 编程挑战的资源。我也考虑过寻找并尝试为一些开源 C 项目做出贡献,但这有点令人生畏,因为在学习使用软件和学习代码库时会有一些开销。我能想到的唯一一个我经常使用的开源 C 项目是 Python,我不确定它是否容易上手。

也就是说,我对各种建议持开放态度,因为有些事情我什至没有想到。

【问题讨论】:

  • 我只想说我喜欢看到这样的帖子,你不只是在说“我如何学习 C,但我自己什么都没做。”荣誉。点赞。
  • 首先,请阅读:stackoverflow.com/search?q=code+kata。其次,更新您的问题,使其尚未得到回答。或者,可能,关闭此问题,因为它与其中一个或多个重复。
  • 我不同意 S.Lott 的观点,他不像大多数其他问题那样寻找初学者介绍。他的背景不同,值得不同的话题和回应。
  • @S.Lott:我通读了这些问题,但没有看到任何与我所问内容相关的内容。如果您想提出一个重复的特定问题,我愿意关闭这个问题,但请记住,我正在寻找一个特定的东西来练习而不是一般的编程。
  • 我认为这个问题很简单......“我读过书,但想要一些实际问题和练习。”这不是 Code Kata,因为他专门询问 Unix 编程,其中包括线程、管道等。 Code Kata 以超市定价为例。 Code Kata 在学习一门新语言时很有用,并且通常与平台无关,但他希望通过特定项目来提高他的 Unix 技能并了解 UNIX 内部结构。

标签: c unix


【解决方案1】:

重新发明了许多核心 Unix 实用程序。其中大部分是(并且仍然是)用 C 语言编写的,因此它们是开始学习的好方法。根据您的技能,选择更难或更容易复制的实用程序。

尝试编写自己的 malloc。你会学到很多关于 Unix 和很多 C 编程的知识。

谷歌计算机科学操作系统课程并在那里做项目。许多学校在公共网站上都有这些项目,因此您可以获得所需的一切。 Here 是普渡大学网站的链接。试一试shell项目;这很困难,但很有教育意义。

【讨论】:

  • 我支持这一点,我做过类似的事情来教自己新技能。个人经验是在 Linux 中为一个简单的硬件设备重新实现内核驱动程序。
  • +1,编写一组核心实用程序将是一个极好的挑战,很快就会产生实际成果。
  • 我非常喜欢这个答案;特别是在课程网站上查找操作系统项目的想法。我没想到。
  • 刚开始我最喜欢的项目之一是重新实现tar。令人惊讶的是,有多少不同的 C 编程领域跨越。
  • @rmeador 非常酷的想法!与原版相比,你的结果如何?
【解决方案2】:

这里有一些讨论 C/Unix 编程书籍的 stackoverflow 帖子。他们的主要声名是对其他资源的广泛扇出。

练习一些习语(了解指针的来龙去脉等)并选择有助于实现这一目标的项目。列表中的第三项有一个答案(免责声明,我写的),其中包含一堆高级 C 习语,其中习语 C 程序与 Java 不同。

使用 C 学习 XLib 或 Win32 GUI 编程可能不太有用,因为几乎任何东西都比 C 更好地用于 GUI 编程,并且用另一种语言包装核心 C 引擎通常要容易得多 - 除非你真的关心速度。作为起点,专注于“系统”编程应用程序,这是您最有可能从 C 语言中获得真正优势的地方。了解 Tcl 或 Python 等脚本语言之一的 C 接口如何工作。

编写一些繁琐且指针繁重的代码(例如,分离网络数据包或解释协议),或使用套接字的服务器端项目将带您进入 C 的核心能力。如果您有一些 WRS 书籍,请尝试使 pthreads 工作(IIRC UNP2 有一个关于 pThreads 的重要部分)。作为对比,写一些使用非阻塞 I/O 的东西。这些东西是 C 的主场,通过这样做,您将获得 C 的良好工作知识。浏览 RFC,了解要实现的网络协议的一些想法。

【讨论】:

  • 感谢您的回答!这些链接不是很有用,因为:(1)面向 Linux 用户而不是开发人员,(2 和 3)是关于学习高级 C 的,我确实需要这样做但不需要在 SO 上询问,和(4 和 5)是关于数据结构和算法的,我有扎实的背景。但是,我认为您对项目的建议非常好——也许学习 Python API 将是最终的方法。
【解决方案3】:

巩固所学知识的最佳方法是实践。因此,只需选择一种您感兴趣的应用程序并开始开发它(例如,网络客户端/服务器简单应用程序)。

尝试测试大多数 Unix API(文件、套接字等)以了解它们是如何工作的。例如,您可以获取一本 Unix 编程书,按照它的章节并通过创建自己的函数来测试您阅读的所有内容。这样,您就可以开始开发自己的函数库,以用于其他项目。

【讨论】:

    【解决方案4】:

    编写一个网络服务器。

    • 使其成为多线程的。

    • 是否支持您开发的新脚本语言(如 PHP 等)

    • 允许经过身份验证的用户上传。

    • 为您喜欢的工具编写插件(即与 SVN 集成以提供 web 视图)。

    【讨论】:

      【解决方案5】:

      您愿意接受预订建议吗?虽然它有点过时(“有点”可能是一个巨大的轻描淡写),但莫里斯巴赫的“Unix 操作系统的设计”是一本很棒的书。它在你书架上的 K&R 旁边。

      【讨论】:

        【解决方案6】:

        您可以尝试通过本书Software Tools(亚马逊)中的所有示例进行操作。其中大部分内容都非常平淡(右对齐文本、去标签等),但它是对 Unix 哲学和基本 C 编程的一个很好的介绍。

        【讨论】:

          【解决方案7】:

          这很有趣。众所周知,Unix是用C语言设计的,学起来可能并不难。如果您使用的是 Windows 操作系统,您可以使用“Unix 的 Windows 服务”应用程序来练习您的程序。如果您使用的是 Unix,那么我们可以使用 vi 之类的编辑器。

          【讨论】:

            【解决方案8】:

            我强烈推荐一件事。

            尝试并重写所有常用的 Linux 命令行工具,如 ls、mkdir、cd 等。

            您将同时获得很多关于编程和 Linux 的知识。

            从最简单的命令中选择“时间”,然后一直到更复杂的命令。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-01-27
              • 1970-01-01
              • 2017-12-20
              相关资源
              最近更新 更多