我最近读到,在 UNIX 版本 3 之前没有出现管道的概念。
但是,由于 UNIX 总是关于简单的程序,它们只做一件事,然后组合起来做更复杂的事情:他们是如何在没有管道的情况下做到这一点的?
Unix 的早期版本包括 Doug McIlroy 的工具tmg(“transmogrifier”),一个早期的编译器-编译器。TMG 是用 Dennis Ritchie 的汇编语言以及 TMGL 本身(TMG 翻译成汇编的语言)实现的。这是TMG 的手册(1972)。这是来自第 6 版 Unix 的完整源代码。
由于我试图了解 McIlroy 对 TMG 的实施是如何工作的,因此我正在阅读该文件tmgl.s,这tmgl.t是由 TMG 完成的翻译。我对以下摘录感到困惑:
.1=.
1
.2=.
2
.3=.
Run Code Online (Sandbox Code Playgroud)
和:
goto;..2
..3:null
..2:
Run Code Online (Sandbox Code Playgroud)
我阅读了PAL-11R和Unix 汇编手册,但不记得有任何解释。
特别:
.意思是“位置计数器”,但什么是.3=.?..意思是“搬迁柜台”,但什么是..3?(更糟糕的是,这种语法似乎只在 TMG 实现中遇到,而不是 Unix V6 的任何其他源文件。而且,为了排除损坏代码或逐步淘汰语法的可能性,TMG 源实际上是在Python 中编译的运行 Unix V6 的PDP-11 模拟器。)
我最初想将其发布到 StackOverflow,因为我的兴趣主要来自于编程焦点,但在阅读了历史标签(以及它链接到的问题)后,我将其发布到 softwareengineering.se以深入了解实际/当前-日《软件工程》方面。然而,我的问题的根本历史性质是不可避免的,所以现在就到这里了。
\n我目前正在了解 Linux 上的日志记录如何工作,并且对RFC 5424或RFC 3164似乎未涵盖的实现细节有点困惑:用于将数据写入/dev/log.
TL;DR:我正在尝试确定 a)“/dev/log格式”的名称,以及 b)其语义的正式指定位置。我无法识别任何 RFC 或其他可引用的参考文献 - 仅代码实现特定规则,没有押韵或理由。
syslog()虽然我最初对这个主题感兴趣,同时评估与其他日志记录策略(写入 stdout/stderr 和/或文件;发送到其他类型的日志服务器等)的优缺点,但有一次我意识到我完全无法确定“/dev/log格式”如何/在何处适应更大的情况。关于 syslog 格式或协议的每个问题都讨论了 RFC,并且完全忽略了控制数据如何离开syslog()并发送到 syslog 服务器的规则。
几乎就像 UNIX 的这个特定角落已经完全消失在木制品中一样,就像不再存在一样……而每天都有数万亿条日志消息使用这种“格式”(?)写入。
\n因此,这个问题是试图消除这个特定细节的歧义,只是为了这样做,描述格式,并确定可引用的参考文献。
\n日志行似乎需要以非常特定的方式进行格式化才能被接受(在我的例子中是 systemd-journald - 首先是优先级/设施信息(包含在 中<>),然后是一个非常特定格式的时间戳,这似乎是通常提到的to 作为标签,然后是消息:
\n# logger -s hi\n<13>3 月 5 日 14:04:11 i336: hi\n\n#journalctl -qn1 -o Short-iso-precise\n2021-03-05T14:04:11.430504+1100 h0nk …
实际上,今天的每个类似 UNIX 的操作系统都区分了多用户模式和单用户模式。单用户模式通常用于在系统正常启动和运行时无法执行的低级别系统维护,即使服务集减少(通常需要离线完成的文件系统维护)。
但是,显然有人必须编写第一个代码才能真正区分单用户模式和多用户模式。
我怀疑多用户模式是在单用户模式之后出现的,仅仅是因为多用户模式可以做更多的事情,并且最初以单用户模式启动系统然后才过渡到多用户模式是有意义的(那就是至少 Linux 是如何做到的;内核在“单用户”模式下工作,如果你传递init=/bin/bash给它,然后有效地init切换到多用户模式就证明了这一点),但我的问题是:什么时候,哪个变体/版本,是两者的区别首先是什么?
我想知道 AT&T 系统 V 的源代码是否仍然可用。
很久以前,在 UNIX 第七版 (a/k/a V7) 中,有一个名为prep. 它的主要用途是获取文本文件,并将它们分解为每行一个单词,以便由管道中的其他工具进一步处理。它也可以做一些其他的操作,比如告诉你文件中每个单词的位置,忽略忽略列表中的特定单词,或者只关注包含列表中特别提到的单词。确切地解释它的作用有点困难,但这里有一个来自 2.9BSD的手册页。它有各种各样有趣的用途——例如,构建字典、拼写检查器等。
这个程序是相当短暂的。它只存在于 V7 和几个分支中(而 2.9BSD 基本上是 V7 的一个分支)。它以前不存在于 V6 中。它已从 V8 中删除。它甚至从未进入 4.2BSD。它在我知道的任何 Linux 发行版中都不存在(至少不是这种形式),也不在 FreeBSD 和朋友中。还有另一个程序(据我所知)首次出现在 V7 上,称为deroff,主要用于完全不同的目的 - 但它有一个“ -w”选项,告诉它“将文件拆分为一个词每行”的东西,类似于prep,但没有执行任何其他功能(如单词编号、包含列表和忽略列表)。我假设是为了建立字典之类的目的,deroff -wprep. 那是相对更长的寿命 - 但是现在,似乎甚至没有deroff为任何主要 Linux 发行版打包的版本,我知道它不在任何最新版本的 RHEL 中,不在 Fedora 32 中,也不在Debian 10(但我很确定它实际上在 Debian 中直到不久前)。
为什么prep走了?真的是因为deroff -w重复了它的大部分功能吗?我认为deroff在当前的 Linux 发行版中已经消失了,因为人们通常不再处理 [nt]roff 格式的文档,除了手册页。但是,随着这两种工具的消失,人们可以使用什么来执行“将文本文件分成每行一个单词”的功能?是否有任何为执行此功能的现代 Linux 发行版打包的东西?(如果你要回答,“你可以用一个简单的脚本自己做这个”,我承认这可能是正确的 - 但这不是我现在正在寻找的答案,我正在寻找一个使用现代 Linux 发行版中已经存在的一些现有工具来做到这一点的方法......)理想情况下,我想找到实现我链接的手册页中列出的所有功能的东西(加上“隐含的”行为)t 在手册页中明确指定,例如不考虑标点符号是单词的一部分,以及如何处理作为“单词”一部分出现的数字)。:-) 实际上,我不认为包含和排除列表特别重要,虽然我想对单词进行编号(有时知道单词在文件中的位置会很方便),但它不是那很重要。在行尾处理带连字符的单词将是可取的。没那么重要。在行尾处理带连字符的单词将是可取的。没那么重要。在行尾处理带连字符的单词将是可取的。
stdbool.h 通常定义为:
#define false 0
#define true 1
Run Code Online (Sandbox Code Playgroud)
而 unix 程序false- 只有一个不成功的状态代码,被定义为:
int
main(int argc, char *argv[])
{
return (1);
}
Run Code Online (Sandbox Code Playgroud)
为完整起见,unix 程序的定义true是:
int
main(int argc, char *argv[])
{
return (0);
}
Run Code Online (Sandbox Code Playgroud)
很明显,它与falsestdbool.h中的值完全相反。我使用了OpenBSD的版本,因为 coreutils 的版本更冗长
使这些不同的历史原因是什么?
为什么最初的 Unix 版本突然变得开源/免费?AT&T 和贝尔实验室让诸如操作系统之类的东西变得可塑造和可转售,并具有操作系统所具有的所有功能,这似乎很奇怪,尤其是在当时它们的数量很少的情况下。我知道他们允许它成为开源的,但我不知道他们为什么这样做。
我链接到The Unix-Haters Handbook并偶然发现(第 149 页):
主题:相关的 Unix 错误
1991 年 10 月 11 日
W4115x 同学——
当我们讨论激活记录、参数传递和调用约定时,您是否知道键入:
Run Code Online (Sandbox Code Playgroud)!xxx%s%s%s%s%s%s%s%s任何 C-shell 都会导致它立即崩溃?你知道为什么吗?
需要思考的问题:
- 当您键入时,shell 会做什么
!xxx?- 当您输入时,它必须对您的输入做什么
!xxx%s%s%s%s%s%s%s%s?- 为什么这会导致外壳崩溃?
- 你怎么能(相当容易地)重写 shell 的有问题的部分,以免出现这个问题?
纯粹出于好奇,谁能解释一下问题出在哪里?不出所料,在 Google 上搜索字符串并没有帮助。从消息中搜索其他引文只会给我消息的其他副本,但没有解释。
Unix 提供标准输出和标准错误,可以独立重定向。
$ ls /not-exist
ls: cannot access '/not-exist': No such file or directory
$ ls /not-exist > redirect.out
ls: cannot access '/not-exist': No such file or directory
$ ls /not-exist 2> redirect.err
$
Run Code Online (Sandbox Code Playgroud)
我听说网络上的某个地方有一个故事,它给出了实施这种分离的有趣原因。它涉及早期 Unix 用于的计算机排版(以及 Unix 管道,我认为)。我现在找不到它。
有没有人想把这个故事链接到这里,将它与相关标签相关联并使其更容易找到?
historical-unix ×10
history ×6
assembly ×1
c ×1
compiler ×1
csh ×1
exit-status ×1
licenses ×1
logs ×1
open-source ×1
pipe ×1
stderr ×1
stdout ×1
syslog ×1