【Linux】Linux是如何诞生的?

2023-10-31

本文主要讲述Linux的诞生背景以及一些小故事,其中,还清晰地讲述了Unix、BSD、GUN、GPL等名词的含义及来源。


Table of Contents

Unix

C语言

BSD

GUN

GPL

Linux

Linux的内核发展


注意:本文学习整理于网络,具体来源已忘记了,如有侵权,请联系我删除,一切都为了学习和推动行业的进步!

故事,还要从Unix的诞生开始讲起:


Unix

MULTICS项目:

  1. 二十世纪六十年代时,大部份计算机都是采用批处理的方式(也就是说,当作业积累一定数量的时候,计算机才会进行处理)
  2. 那时,我们熟知的美国电话及电报公司(AT&T)、通用电器公司(G.E.)及麻省理工学院(MIT)计划合作开发一个多用途、分时及多用户的操作系统,也就是这个MULTICS,其被设计运行在GE-645大型主机上。
  3. 不过,这个项目由于太过复杂,整个目标过于庞大,糅合了太多的特性,进展太慢,几年下来都没有任何成果,而且性能都很低。
  4. 于是到了1969年2月,贝尔实验室决定退出这个项目

Ken Thompson和Dennis Ritchie:

  • 贝尔实验室中的有个叫 Ken Thompson 的人(如下图),他为 MULTICS 这个操作系统写游戏了个叫“Space Travel”的游戏,在 MULTICS 上经过实际运行后,他发现游戏速度很慢而且耗费昂贵 —— 每次运行会花费75美元。

  • 退出MULTICS项目以后。他为了让这个游戏能玩,所以他找来Dennis Ritchie(如下图)为这个游戏开发一个极其简单的操作系统。这就是后来的Unix

  • 值得一提的是,当时他们本想在DEC-10(可以把它看做是一个硬件平台)上写,后来没有申请到,只好在实验室的墙角边找了一台被人遗弃的 Digital PDP-7 的迷你计算机进行他们的计划,这台计算机上连个操作系统都没有,于是他们用汇编语言仅一个月的时间就开发了一个操作系统的原型。

Unix诞生:

  1. 他们的同事Brian Kernighan非常不喜欢这个系统,嘲笑Ken Thompson说:“你写的系统好真差劲,干脆叫Unics算了。” Unics 的名字就是相对于 MULTICS 的一种戏称,后改成了Unix。
  2. 于是,Unix 就在这样被游戏和玩笑创造了,当时是1969年8月。也就是这一年,Linux 之父 Linus Torvalds 在芬兰出生了。
  3. 1971年,Ken Thompson 写了充分长篇的申请报告,申请到了一台PDP-11/24的机器。于是Unix第一版出来了。在一台PDP-11/24的机器上完成。这台电脑只有24KB的物理内存和 500K 磁盘空间。
  4. Unix占用了12KB的内存,剩下的一半内存可以支持两用户进行Space Travel的游戏。而著名的 fork() 系统调用也就是在这时出现的。

C语言

C语言诞生背景:

  1. 到了1973年的时候,Ken Thompson 与 Dennis Ritchie 感到用汇编语言做移植太过于头痛,他们想用高级语言来完成第三版Unix,对于当时完全以汇编语言来开发程序的年代,他们的想法算是相当的疯狂。
  2. 一开始他们想尝试用Fortran,可是失败了。后来他们用一个叫BCPL的语言开发,他们整合了BCPL形成B语言,后来Dennis Ritchie觉得B语言还是不能满足要求,就是就改良了B语言,这就是今天的大名鼎鼎的C语言
  3. 于是,Ken Thompson 与 Dennis Ritchie 成功地用C语言重写了 Unix 的第三版内核。至此,Unix这个操作系统修改、移植相当便利,为Unix日后的普及打下了坚实的基础。而Unix和C完美地结合成为一个统一体,C与Unix很快成为世界的主导。

Unix的流行:

  1. Unix 的第一篇文章 “The UNIX Time Sharing System”Ken Thompson 和 Dennis Ritchie 于1974年7月的 the Communications of the ACM 发表。这是UNIX与外界的首次接触。
  2. 结果引起了学术界的广泛兴趣并对其源码索取,所以,Unix第五版就以“仅用于教育目的”的协议,提供给各大学作为教学之用,成为当时操作系统课程中的范例教材。各大学公司开始通过 Unix 源码对 Unix 进行了各种各样的改进和扩展。于是,Unix 开始广泛流行。

BSD

BSD的诞生:

  1. 1977 年,Berkeley 大学的 Bill Joy 针对他的机器修改 UNIX 源码,称为BSD(Berkeley Software Distribution),Bill Joy 是 Sun 公司的创始人(就是Java诞生的那个公司)
  2. 1978年,对 Unix 而言是革命性的一年;因为学术界的老大柏克利大学,推出了一份以第六版为基础,加上一些改进和新功能而成的 Unix。这就是著名的“1 BSD(1st Berkeley Software Distribution)”,开创了Unix的另一个分支:BSD 系列。 同时期,AT&T成立USG,将 Unix变成商业化的产品。

 

BSD-Unix和AT&T-Unix:

  1. 从此,BSD的 Unix 便和AT&T 的Unix 分庭抗礼,Unix就分为System IV 和 4.x BSD这两大主流,各自蓬勃发展。
  2. BSD对UNIX最重要的贡献之一是TCP/IP。BSD 有8个主要的发行版中包含了TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4以及 4.4-lite。这些发布版中的TCP/IP代码几乎是现在所有系统中TCP/IP实现的前辈,包括AT&T System V UNIX 和Microsoft Windows中的TCP/IP都参照了BSD的源码。
  3. 1979 年,UNIX 发布 System V,用于个人计算机;
  4. 1984 年,因为 UNIX 规定:“不能对学生提供源码”,Tanenbaum老师自己编写兼容于 UNIX 的Minix,用于教学;

 

Unix的私有商业化:

  1. 这是一个AT&T妄图私有化的Unix的时代。为了私有化Unix,1986年IEEE指定了一个委员会制定了一个一个开放作业系统的标准,称为 POSIX (Portable Operating Systems Interface)。最后加上个X,不知道是为了好听,还是因为这本质上是UNIX的标准。
  2. 当然,AT&T的Unix取得了这个标准制订战争的胜利,还取得了Unix这个注册商标。此时BSD的拥护者自喻为冷酷无情的公司帝国的反抗军。就销售量来说,AT&T UNIX始终赶不上BSD/Sun。到1990年,AT&T与BSD版本已难明显区分,因为彼此都有采用对方的新发明。
  3. 这段时期,从实验室出来的被全世界所分享的Unix,正处于被私有化的关键时期。

 

BSD分支:

  1. FreeBSD: FreeBSD 是最受欢迎的 BSD,针对高性能和易用性。它支持英特尔和 AMD 的32位和64位处理器。
  2. NetBSD: NetBSD 被设计运行在几乎任何架构上,支持更多的体系结构。在他们的主页上的格言是"理所当然,我们运行在 NetBSD 上"。
  3. OpenBSD: OpenBSD 为最大化的安全性设计的 —— 这不仅仅它宣称的功能,在实践中也确实如此。它是为银行和其他重要机构的关键系统设计的。
  • 还有两个其他的重要 BSD 操作系统:
    1. DragonFly BSD: DragonFly BSD 的设计目标是提供一个运行在多线程环境中的操作系统 —— 例如,计算机集群。
    2. Darwin / Mac OS X: Mac OS X 实际上基于 Darwin 操作系统,而 Darwin 系统基于 BSD。它与其他的 BSD 有点不同,虽然底层内核和其他的软件是开源代码(BSD 代码),但操作系统的大部分是闭源的 Mac OS 代码)。苹果在 BSD 基础上开发了 Mac OS X 和 iOS,这样他们就不必写操作系统底层,就像 谷歌在 Linux 基础上开发 android 系统一样。

GUN

诞生背景:

  1. AT&T的这种商业态度(闭源,不开放源代码,还收费,就像是现今的Windows),让当时许许多多的Unix的爱好者和软件开发者们感到相当的痛心和忧虑,他们认为商业化的种种限制并不利于产生的发展,相反还能导制产品出现诸多的问题。随着商业化Unix的版本的种种限制和诸多问题,引起了大众的不满和反对。
  2. 于是,大家开始有组织地结成“反叛联盟”以此对抗欺行罢市的AT&T等商业化行为。

 

Richard Stallman

  • 此时,一个名叫Richard Stallman的领袖出现了(如下图),他认为Unix是一个相当好的操作系统,如果大家都能够将自己所学贡献出来,那么这个系统将会更加的优异!他倡导的Open Source的概念,就是针对Unix这一事实反对实验室里的产品商业化私有化。

  • 尽管Stallman既不是、也从来没有成为一个Unix程序员,但在后1980的大环境下,实现一个仿Unix操作系统成了他追求的明确战略目标。
  • Richard Stallman早期的捐助者大都是新踏入Unix土地的老牌ARPANET黑客,他们对代码共享的使命感甚至比那些有更多Unix背景的人强烈。

GNU

  • 1984 年,Richard Stallman开始 GNU(GNU’s Not Unix)项目,计划开发一套与Unix相互兼容的操作系统。Stallman是一个有理想的人,他想建立一个完全自由的操作系统,公开源码,任何人都可以修改该系统。他给这个操作系统取的名字叫GNU

  • 1985 年 Richard Stallman 又创办 FSF(Free Software Foundation)基金会来为 GNU 计划提供技术、法律以及财政支持。
  • 尽管 GNU 计划大部分时候是由个人自愿无偿贡献,但 FSF 有时还是会聘请程序员帮助编写。当 GNU 计划开始逐渐获得成功时,一些商业公司开始介入开发和技术支持。当中最著名的就是之后被 Red Hat 兼并的 Cygnus Solutions。

Richard Stallman的GNU项目核心:

  1. 产品:GCC、Emacs、Bash Shell、GLIBC;
  2. 倡导:自由软件;自由软件指用户可以对软件做任何修改,甚至再发行,但是始终要挂着 GPL 的版权; 自由软件是可以卖的,但是不能只卖软件,而是卖服务、手册等;
  3. GNU 的软件缺乏一个开放的平台运行,只能在 UNIX 上运行;

 

  1. GNU组织的建立,延续了当年Unix刚出现时的情形,并为这种情形建立了可靠的法律和财务保障。GNU 工程十几年以来, 已经成为一个对软件开发主要的影响力量, 创造了无数的重要的工具。例如:强健的编译器(如GCC),有力的文本编辑器,甚至一个全功能的操作系统。从那时开始,许多程序员聚集起来开始开发一个自由的、高质量、易理解的软件,让这使得Unix社区生机勃勃,一派繁荣景象。
  2. 要提供一个完整的操作系统,需要包含内核、编译器、编辑工具、C库、Shell等等一系列重要组成部件。自90年代发起这个计划以来,GNU 开始大量的产生或收集各种系统所必备的组件,像是函数库、编译器、调式工具、文本编辑器、网站服务器,以及一个Unix的使用者接口(Unix shell)等等。
  3. 到了1990年左右的时候,GUN社区已经大成气候了,但这时还缺一个内核,Stallman开始开发内核,取名为Hurd,但由于各种原因Hurd被耽误了。所以,GNU一直没有操作系统的kernel。正当Richard Stallman在为操作系统内核伤脑筋的时候,Linux 出现了。

GUN/Linux

  1. 由于Linus Torvalds在1991年开发了的Linux内核,由于也遵循自由软件之精神,跟GUN完美的融合在一起,终于形成了一个完美的操作系统。
  2. 革命成功后总要分江山的,从Stallman的观点来看,Linux仅仅是整个GUN项目的一部分,因此我们目前含义上的Linux操作系统应该叫GUN/Linux,这样才能更加贴切的说明GUN和Linux之间的关系,但这个提法没有多少人真正的响应。

GPL

GPL诞生背景:

  1. 计算机软件作为人类的知识财富,为人类社会的发展起到了巨大的作用,但长期以来软件源码作为个人或公司的私有财产受到严格的保密,很难做到像文学艺术作品一样地进行公开的交流,很大程度上造成软件的低水平,重复劳动严重,在一定意义上制约了软件的发展。
  2. 就像是Microsoft的Windows操作系统,就只有该公司内部能够查看源代码和修改操作。

GPL

  • 1985 年,Richard Stallman提出“应将软件源码看成人类共同拥有的知识财富,应该公开地自由交换、修改”。于是,为了避免 GNU 开发的自由软件被其他人用作专利软件, Richard Stallman创建 GPL(General Public License)版权声明

该授权书主要有以下几点:

  • 自由软件(free software)指的是源码自由,不是价格
  • 自由软件必须附带程序源代码,但可收取费用;
  • 任何人都可以自由分发自由软件并收取费用,但必须列明原创者姓名
  • 任何人都可以修改源代码,但必须列明修改人名字,以保护原创者名誉;
  • 任何人都可以采用源代码中的某一段,但其开发之软件必须也为自由软件(例如,如果 Netscap 是自由软件,而 IE 采用了其中的部份源代码,则 IE 也必须成为自由软件);
  • 任何自由软件的衍生品也必须是自由软件
  • 自由软件没有担保,以保护分发者。
  1. 1991 年,Richard Stallman 对授权做了微小的修改,即所谓的通用公共授权第 2 版。同时,他也推出了更宽松的通用公共授权,用于自由程序库。这一系列的授权有效地保护了自由软件不受商业软件的非法侵犯,例如,1998 年 Netscap 决定采用与 GPL 差不多的 NPL(Netscap Public Liscense),这样一来,Microsoft 就无法将 Netscap 中的源代码运用在 IE 上,除非它们也要成为自由软件。
  2. 至此,在 GPL 下人们就可以自由交流、修改软件源码了,这一协议极大地推动了整个计算机软件行业的发展,并带来了以下明显的益处:
  • 对于广大计算机软件的学习者来说,可以直接从源码中吸取营养,缩短学习的时间,提高学习的效率,少走弯路,再也不必花大量时间去看那些不知正确与否的“未解之谜”了,学习在某种程度上变成了一件轻松愉快的事情了。
  • 可以集中大家的智慧发展软件,避免重复劳动。一个软件只有公开源码,通过很多人的研究才有可能发现其中深藏的错误,大家才能公开探讨相关的问题,并进行改进,在大家的共同“挑剔与监督”下才有可能编写出尽善尽美的软件来。

 

GPL总结:

  1. GPL 协议的核心就是要对源码进行公开,并且允许任何人修改源码,但是只要使用了 GPL 协议的软件源码,其衍生软件也必须公开源码,准许其他人阅读和修改源码,即 GPL 协议具有继承性
  2. 另一个问题就是 GPL 软件并非就是免费软件,这里所说的自由软件是指对软件源码的自由获得与自由使用、修改,软件开发者不但可以通过服务来收费,而且还可以通过出售 GPL 软件来获利
  3. 适应 GPL 协议的软件一般都是自由软件,自由软件是指一件可以让用户自由复制、使用、研究、修改、分发等,而不附带任何条件的软件。

Linux

起源:

  1. 1991 年,芬兰赫尔辛基大学的研究生 Linus Torvalds 基于 gcc、bash 开发了针对 i386 机器的 Linux 内核;Linus Torvalds最初是用汇编语言写了一个在80386保护模式下处理多任务切换的程序,后来从 Minix(Andy Tanenbaum教授所写的很小的 Unix 操作系统,主要用于操作系统教学)得到灵感,进一步产生了自认为狂妄的想法——写一个比 Minix 更好的Minix,于是开始写了一些硬件的设备驱动程序,一个小的文件系统。这样0.0.1版本的 Linux 就出来了,但是它只具有操作系统内核的勉强的雏形,甚至不能运行,你必须在有Minix的机器上编译以后才能玩。
  2. 8月25号 : 21岁的芬兰学生Linus Benedict Torvalds 在comp.os.minix 新闻组上宣布了它正在编写一个免费的操作系统。9月1号 : Linux 0.01在网上发布。
  3. 这时候Linus已经完全着迷而不想停止,决定踢开 Minix,于是在1991年10 月5号发布Linux 0.0.2版本,在这个版本中已经可以运行 bash 和 gcc。

 

  1. 从一开始,Linus就决定自由扩散Linux,包括原代码,随即Linux引起黑客们(hacker)的注意,通过计算机网络加入了Linux的内核开发。Linux倾向于成为一个黑客的系统——直到今天,在Linux社区里内核的开发被认为是真正的编程。
  2. 由于一批高水平黑客的加入,使Linux 发展迅猛,几乎一两个礼拜就有新版或修正版的出现,到1993年底94年初,Linux 1.0 终于诞生了!Linux 1.0已经是一个功能完备的操作系统,而且内核写得紧凑高效,可以充分发挥硬件的性能,在4M内存的80386机器上也表现得非常好,至今人们还在津津乐道。

 

命名:

  1. Linus Torvalds本要把他的发时叫做Freax—“fread”“free”和“x”(暗指Unix)的合成词。Tux.png在开发系统的前半年里,他把文件以文件名“Freax”存储。Torvalds考虑过Linux这个名字,但是因为觉得它过于自我本位而放弃了使用它。
  2. 为便于开发,在1991年9月,他把那些文件上传到了赫尔辛基工业大学(HUT)的FTP服务器(ftp.funet.fi)。Torvalds在HUT负责管理那个服务器的同事Ari Lemmke,觉得“Freax”这个名字不是很好,就在不咨询Torvalds的情况下,把项目的名字改成了“Linux”。
  3. 但是之后,Torvalds也同意“Linux”这个名字了:“经过多次讨论,他承认Linux这个名字更好。在0.01版本Linux的源代码的makefile里仍然使用‘Freax'这个名字,在之后‘Linux'这个名字才被使用。

 

Linux标志:

  1. 1994年发表Linux正式核心1.0的时候,大家要Linus Torvalds想一只吉祥物,他想起曾经在澳大利亚的一个动物园里被企鹅咬过,干脆就以企鹅来当吉祥物了!
  2. 更容易接受的说法是:企鹅代表南极,而南极又是全世界共有个一块陆地,不属于任何国家。也就是说Linux不属于任何商业公司,是全人类每个人都可以分享的一项技术成果。

 

GNU与Linux:

  1. Linux 的历史是和GNU紧密联系在一起的。从1983年开始由Richard Stallman提出的GNU计划致力于开发一个自由并且完整的类Unix操作系统,包括软件开发工具和各种应用程序。
  2. 到1991年 Linux 内核发布的时候,GNU已经几乎完成了除了系统内核之外的各种必备软件的开发。在 Linus Torvalds 和其它开发人员的努力下,GNU组件可以运行于Linux内核之上。整个内核是基于 GNU 通用公共许可,也就是GPL(GNU General Public License,GNU通用公共许可证)的,但是Linux内核并不是GNU 计划的一部分

 

1992年1月5号: Linux v0.12 release 版本的内核重新以GUN GPL的协议发布。

  1. 原来的许可证是禁止任何商业用途的。通过这次协议变更,发布和出售修改或未修改版的Linux成为了可能,只要你将这些复制版本以相同的GPL许可证发布,并且有相对应完整的源代码。
  2. 在后来的一次采访中,Linus对这次许可证的更改说了这样一句话(让Linux遵守GPL绝对是我干过的最正确的事):" Making Linux GPL'd was definitely the best thing I ever did."
  3. 1月29号: Andrew S. Tanenbaum向comp.os.minix邮件列表发送了一封名为LINUX is obsolete的邮件。总的来说,这次被一些人升级为“战火”的争论是关于Linux和内核架构的。Tanenbaum争辩说微内核比宏内核更加高级,所以Linux是过时的。
  4. 4月5号: 第一个Linux新闻组,comp.os.linux由Ari Lemmke提议和开通。
  5. 5月21号: Peter MacDonald 发布第一个独立的Linux安装包SLS。可以通过软盘安装,包括比较前沿的TCP-IP网络支持和X Window系统。建议至少预留10M的磁盘空间来安装。
  • 严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和应用程序的操作系统(也被称为GNU/Linux)。基于这些组件的Linux软件被称为Linux发行版。
  • 一般来讲,一个Linux发行套件包含大量的软件,比如软件开发工具,数据库,Web服务器(例如Apache),X Window,桌面环境(比如GNOME和KDE),办公套件(比如OpenOffice.org),等等。

影响:

  1. 1991至1995年间,Linux从概念型的 0.1 版本内核原型,发展成为能够在性能和特性上均堪媲美专有Unix的操作系统,并且在连续正常工作时间等重要统计数据上打败了这些Unix中的绝大部分。1995年,Linux找到了自己的杀手级应用——开源的web服务器Apache。就像Linux,Apache出众地稳定和高效。很快,运行 Apache 的 Linux 机器成了全球ISP平台的首选。约60%的网站选用Apache,轻松击败了另两个主要的专有型竞争对手。今天的LAMP(Linux ,Apache,MySQL,PHP)已经成为了架构 Web 服务器的主要首选。
  2. 现如今的Linux不但可以装在几乎所有的主流服务器上,当然也包括桌面的X86系统中。其还常常被用于嵌入式系统,机顶盒、手机、交换机、游戏机、PDA、网络交换机、路由器、等等,都是因为 Linux 那精彩的内核。
  3. Linux 的出现,不仅仅给世界带来了一个免费的操作系统,也不仅仅是对 Unix 自由、共享的文化的延续,它的出现带给了计算机世界自 Unix、GNU 以来更为成熟的思想和文化。

Linux的内核发展

来源:https://zh.wikipedia.org/wiki/Linux%E5%86%85%E6%A0%B8

  1. 1991年9月,Linux内核版本 0.01 在芬兰大学和研究网络(FUNET)的FTP服务器(ftp.funet.fi)上发布。它有10,239行代码。在1991年10月,0.02版本的内核发布了。                                    
  2. 1991年12月,0.11版本的内核发布。由于它可以由运行相同内核版本的计算机编译,因此该版本是第一个自托管的 Linux 内核。当托瓦茲于1992年2月发布0.12版本时,他采用了 GNU 通用公共许可证(GPL),而不是以前的自行起草的许可证,原先的许可证不允许商业再分发。
  3. 1992年1月19日,第一篇文章提交给新的新闻组alt.os.linux出现。
  4. X Window 系统随后被移植到Linux上,所以在1992年3月,Linux 0.95 是第一个能够运行X的版本。从0.1x到0.9x的版本号大幅跨越是因为期望没有大的缺失部分的版本1.0的即将出现。然而,这被证明是错误的。从1993年到1994年初,出现了0.99版本的15个开发版本。
  5. 1994年3月14日,Linux内核1.0.0发布,共176,250行代码。随后的1995年3月,有310,950行代码的 Linux 内核1.2.0发布。
  6. 在1996年6月9日发布的 Linux内核2.0版本之后,以2.0为大版本的主要更新有如下这些:
  7. 1999年1月25日 - 发布Linux内核2.2.0(1,800,847行代码)
  8. 1999年12月18日 - 针对2.2.13的 IBM 大型机补丁发布,允许 Linux 内核用于企业级机器
  9. 2001年1月4日 - 发布 Linux 内核2.4.0(3,377,902行代码)
  10. 2003年12月17日 - 发布 Linux 内核2.6.0(5,929,913行代码)
  11. 从2004年开始,发布过程发生了变化,新的内核每隔2-3个月定期发布,编号为2.6.0、2.6.1,直到2.6.39。
  12. 2011年7月21日,Torvalds宣布发布Linux内核3.0:“2.6.<大版本> 的日子过去了”。
  13. 2013年6月发布的Linux内核版本3.10包含15,803,499行代码
  14. 2015年6月发布的4.1版本已发展到超过1950万行代码,由近14000名程序员贡献。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】Linux是如何诞生的? 的相关文章

  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用 xlib 在屏幕顶部绘图

    我想在屏幕上的所有窗口顶部绘制一些图元 我在 C 中找到了一些代码并尝试将其移植以使用 python 的 xlib from Xlib display import Display from Xlib import X from Xlib
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 如何从 HTTP URL 下载文件?

    我知道如何使用wget从FTP下载但我无法使用wget从以下链接下载 如果您将其复制并粘贴到浏览器中 它将开始下载 但我想将它直接下载到我们的服务器 这样我就不需要将它从我的桌面移动到服务器 我该怎么做 Thanks 这就是我所做的 wge
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • execv() 和 const 性

    我经常使用execv 函数在 C 中 但如果某些参数在 C 字符串中 则令我烦恼的是我无法执行此操作 const char args 4 args 0 usr bin whatever args 1 filename c str args
  • 如何使用 UNIX shell 脚本删除平面文件的页眉和页脚记录?

    我有一个平面文件 如下所示 如何使用 UNIX shell 脚本从文件中删除页眉和页脚并重写同一文件 9 20050427 HEADER RECORD 0000000 00000 000000000 123456 00 654321 DAT
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 华为OD2023(A卷)基础题26【最大利润、贪心的商人】

    题目 最大利润 商人经营一家店铺 有number种商品 由于仓库限制每件商品的最大持有数量是item index 每种商品的价格是item price item index day 通过对商品的买进和卖出获取利润 请给出商人在days天内能
  • qcharts控件如何提升

    条件 qt5 9版本以后 编译器也要对应的新版本 否则无法释放该版本qt库的所有功能 已经下载了qtcharts模块 如果安装qt时候没有勾选 则打开安装目录的MaintenanceTool exe软件 重新将qtcharts模块勾选上安装
  • R-Drop和SimCSE解读

    R Drop Regularized Dropout for Neural Networks R Drop的基本思想是 同一个step里面 对于同一个样本 前向传播两次 由于Dropout的存在 会得到两个不同但差异很小的概率分布 通过在原
  • JavaScript中远程级联调用(RPC)java对象中的方法并返回结果

    http code google com p json rpc for java downloads list
  • 如何修改服务器远程端口

    1 开始 运行 regedit 2 依次展开 HKEY LOCAL MACHINE SYSTEM CURRENTCONTROLSET CONTROL TERMINAL SERVER WDS RDPWD TDS TCP 右边键值中 PortN
  • Stm32f030 双串口

    void USART INIT void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitStructure NVIC InitTypeDef NVIC Ini
  • Ubuntu 安装 conda

    下载 Anaconda 进入 Ubuntu 自己新建下载路径 输入以下命令开始下载 注意 如果不是 x86 64 需要去镜像看对应的版本 https mirrors bfsu edu cn anaconda archive C M O A
  • (十三)CMake MESSAGE和PROJECT

    一 MESSAGE MEESSAGE的功能是记录一个信息 当我们执行 编译 含有message命令的代码时 将会在终端打印指定内容 如果超过一个信息字符串 它将会拼接成一个信息 无缝连接 MESSAGE报告的信息可以是 普通信息 报告检查信
  • android手机安装ubuntu并创建ubuntu图形界面(1)

    在安卓手机上安装Ubuntu并创建图形界面 1 下载termux 用手机直接打开网址Termux F Droid Free and Open Source Android App Repository 点击下载apk并安装 安装后启动界面如
  • Scrapy运行builtins.ImportError: No module named 'win32api'

    windows 下 安装好scrapy后 运行 scrapy bench 报错builtins ImportError No module named win32api 解决方法 pip install pypiwin32
  • 关于自搭网站XAMPP(一)前后端AJAX-PHP数据连通

    前端AJAX代码
  • DEDECMS如何将图片轮播做到后台控制

    网上找了一大堆 试了好多方法 都不管用 最后偶尔看到这几行代码 没想到成功了 然后自己做个总结 方法如下 直接建立一个顶级栏目 然后在该顶级栏目里添加文档 在文档里面只上传缩略图 不要添加内容 然后在模板页面调用下面的代码标签 就好啦 把下
  • CRC32爆破小结

    前言 最近在bugku遇到了一道隐写题 binwalk之后发现里面有很多个压缩包 然后就无从下手 于是查看别人大佬的wp才发现是CRC32爆破 由于本人第一次遇到这种题目 就记录一下吧 正文 CRC想必大家都知道 它的全称是循环冗余校验 C
  • 2022-面试题汇总

    1 四大频繁Full GC原因 1 大量反射代码使永久代类太多导致频繁Full GC 解决方案 在有大量反射代码的场景下 只要把 XX SoftRefLRUPolicyMSPerMB 0 这个参数设置大一些即可 千万别让一些新手同学设置为0
  • 图像处理库(fbc_cv):源自OpenCV代码提取

    在实际项目中会经常用到一些基本的图像处理操作 而且经常拿OpenCV进行结果对比 因此这里从OpenCV中提取了一些代码组织成fbc cv库 项目fbc cv所有的代码已放到GitHub中 地址为 https github com feng
  • java总结输入流输出流

    1 什么是IO Java中I O操作主要是指使用Java进行输入 输出操作 Java所有的I O机制都是基于数据流进行输入输出 这些数据流表示了字符或者字节数据的流动序列 Java的I O流提供了读写数据的标准方法 任何Java中表示数据源
  • 算法笔记-图搜索

    统计图的连通分支数 思路 建图 搜索 注意这种建图方式是有向图 反例 1 2 3 4 4 1这种不会识别出来 因此建图时需要使用有向图 在add阶段加入两个方向的路径 add时从1开始的边的标号 0用来判断结束 斗则冲突有问题 int to
  • 追雨的际遇

    追雨 下班 刚出公司 隐约看到远处电闪雷鸣 明明今天是大好的晴天 看到电闪 确实稀奇 忽然豆大的雨点落了下来 恰逢我骑到桥洞底下 让雨先跑10分钟 等我换好雨衣 就去追她 桥洞底下 停车 开后备箱 开始换雨衣 陆续很多摩托停在我的身后 他们
  • Vue使用v-for遍历map

    功能 遍历数据库中按钮的图片和名字 当页面打开时 触发查询事件 以下图形式显示出来 前端代码 遍历存在数据库中的按钮名称和图片名称 其中按钮的click事件名称和按钮图片名称相同
  • 【Linux】Linux是如何诞生的?

    本文主要讲述Linux的诞生背景以及一些小故事 其中 还清晰地讲述了Unix BSD GUN GPL等名词的含义及来源 Table of Contents Unix C语言 BSD GUN GPL Linux Linux的内核发展 注意 本