【问题标题】:How to combine multiple small C programs together? [closed]如何将多个 C 小程序组合在一起? [关闭]
【发布时间】:2011-10-29 16:01:28
【问题描述】:

unix 的哲学之一是编写小型软件组件,然后将它们连接在一起,例如 uzbl 或 git,但我问您如何将它们组合在一起以构成一个大型应用程序?如果我有兴趣将 C 程序粘合在一起,我是否编写另一个程序来调用它们,通过 system() 调用来执行系统以提供所需的行为?有哪些好的做法?我在哪里可以找到该领域更深入的细节。

例如,我正在尝试开发自己的程序,并希望将程序的不同组件划分在一起。以网络浏览器 Uzbl 或版本控制软件 git 为例,它们如何将不同的二进制文件绑定在一起以生成一个?

【问题讨论】:

  • 您实际上是在尝试将程序粘合在一起,还是将多个功能粘合在一起?通常,C 程序是通过将多个函数链接在一起来构建一个程序来构建的。有一个程序,通常称为 LINKER,它获取所有函数并将它们链接在一起。
  • 我想我可能正在尝试将程序粘合在一起,但不一定要使用 shell 脚本来做到这一点。或者这就是 git 或 uzbl 之类的程序的作用?
  • unix 的理念是避免大型应用程序。
  • 是的,我明白了,但在某些时候,仍然需要将一些组件粘合在一起以构成一个系统!它是第 22 条,但在某些情况下你不能没有,仍然对将软件组件粘合在一起的最佳方式感兴趣。

标签: c shell unix


【解决方案1】:

取决于您从哪个级别查看此内容。如果你想在命令行组合几个预先构建的程序,你可以使用类似于 Unix 的管道,例如dir | sort.

如果您正在开发并希望重用现有代码,您可以将现有功能作为库链接到您的应用程序,或者只是重用现有类。

【讨论】:

【解决方案2】:

您提到了 git,它最初是一个小工具的集合,每个工具在存储库上执行相对较小的操作,以及一组使用这些工具的脚本(shell 和 Perl)。比如你可以看看git pull的代码(实际上是一个shell脚本),看看它是如何调用大多数git用户不知道的不同git程序的。

一般来说,如果你想编写程序的一部分作为过滤器,让它简单地从标准输入读取输入(使用 fread、fgets、fscanf 等)并将输出写入标准输出(fprintf、fwrite 等) .然后,您可以使用管道在 shell 脚本中调用您的过滤器。

组合程序的另一种方法是通过双向进程间通信,即不是通过 shell 脚本中的管道,而是使用例如插座。您可以将程序拆分为两个部分,一个服务器和一个客户端,它们相互通信但具有不同的目标。比如X系统和FreeCiv就是这样写的。

有些程序不容易分解为多个较小的程序和过滤器。在这种情况下,通常最好将程序分解为库,这也是 Unix 哲学的一部分,因为库也可以被其他程序重用。

我还建议查看The Art of Unix Programming,它更详细地介绍了软件工程和 Unix 哲学。

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2021-02-18
    • 2018-02-18
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2016-12-26
    相关资源
    最近更新 更多