unix 订阅
Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,目前主要用于工程应用和科学计算等领域。 [1] 展开全文
Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,目前主要用于工程应用和科学计算等领域。 [1]
信息
学    科
计算机科学
外文名
UNIX
类    型
多用户、多任务操作系统
中文名
尤尼克斯
设计原则
简洁至上、提供机制而非策略
unix发展历史
UNIX系统是一个分时系统。最早的UNIX系统于1970年问世。此前,只有面向批处理作业的操作系统,这样的系统对于需要立即得到响应的用户来说是太慢了。在60年代末,Kenneth Thompson和Dennis Ritchie都曾参加过交互方式分时系统Multics的设计,而开发该系统所使用的工具是CTSS。这两个系统在操作系统的发展过程中都产生过重大影响。在此基础上,在对当时现有的技术进行精选提炼和发展的过程中,K.Thompson于1969年在小型计算机上开发UNIX系统,后于1970年投入运行。 [2]  1973年,DennisRitchie开发出C语言,用来改写原来用汇编语言编写的UNIX,由此产生了UNIX VersionV。1974年,Kenneth Thompson和Dennis Ritchie合写的“The UNIX Time-Sharing System"在Communication of ACM上发表,正式向外界披露了UNIX系统。 [2]  当时,PDP-11系列小型计算机在世界各地已经得到广泛应用,UNIX系统一开发后便广泛配备于美国各大学的PDP-11系列计算机上,由此为UNIX的广泛应用创造了物质条件。 [2]  1978年,UNIX Version VI发表,随后又于1979年用于VAX-11超级小型机。以后,不断地出现各种新的版本。美国电话电报公司分别于1981年和1983年发表AT&T UNIX SystemII和UNIX SystemV。美国加州大学伯克莱分校也先后发表了UNIX的版本BSD4.1,BSD4.2和BSD4.3。 [2]  现在UNIX系统的用户日益增多,应用范围也日益扩大。无论在各种类型的微型机、小型机,还是在中、大型计算机,以及在计算机工作站甚至个人计算机上,很多都已配有UNIX系统。不仅新推出的机型配有UNIX系统,而且一些历史较久的生产厂商,也竞相将原有机型配上UNIX系统以便打开销路、争取市场。 [2] 
收起全文
精华内容
参与话题
问答
  • 【0基础学Python教程系列】(一)Python 环境搭建,包含Windows、Unix & Linux系统安装Python。 目录: 一、Python介绍 二、Python下载 三、Python安装 Unix & Linux 平台安装 Python: Window系统安装...

    【0基础学Python教程系列】(一)Python 环境搭建,包含Windows、Unix & Linux系统安装Python。

    目录:

    一、Python介绍

    二、Python下载

    三、Python安装

    Unix & Linux 平台安装 Python:

    Window系统安装Python:

    MAC 平台安装 Python:

    环境变量配置

    在 Unix/Linux 设置环境变量

    在 Windows 设置环境变量

    Python 环境变量

    运行Python

    1、交互式解释器:

    2、命令行脚本


    一、Python介绍

    本节小编主要向大家介绍如何在本地搭建Python开发环境。

    Python可应用于多平台包括Windows、 Linux 和 Mac OS X。

    你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。

    • Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)
    • Win 9x/NT/2000
    • Macintosh (Intel, PPC, 68K)
    • OS/2
    • DOS (多个DOS版本)
    • PalmOS
    • Nokia 移动手机
    • Windows CE
    • Acorn/RISC OS
    • BeOS
    • Amiga
    • VMS/OpenVMS
    • QNX
    • VxWorks
    • Psion
    • Python 同样可以移植到 Java 和 .NET 虚拟机上。

    二、Python下载

    Python最新源码,二进制文档,新闻资讯等可以在Python的官网查看到:

    Python官网:https://www.python.org/

    你可以在以下链接中下载 Python 的文档,你可以下载 HTML、PDF 和 PostScript 等格式的文档。

    Python文档下载地址:https://www.python.org/doc/

    三、Python安装

    Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。

    您需要下载适用于您使用平台的二进制代码,然后安装Python。

    如果您平台的二进制代码是不可用的,你需要使用C编译器手动编译源代码。

    编译的源代码,功能上有更多的选择性, 为python安装提供了更多的灵活性。

    以下是各个平台安装包的下载地址:

    Python教程
    Python教程   -  Python安装教程

    以下为不同平台上安装 Python 的方法:

    Unix & Linux 平台安装 Python:

    下面为在 Unix & Linux 平台上安装 Python 的简单步骤:

    • 打开 WEB 浏览器访问https://www.python.org/downloads/source/
    • 选择适用 于Unix/Linux 的源码压缩包。
    • 下载及解压压缩包。
    • 如果你需要自定义一些选项修改Modules/Setup
    • 执行 ./configure 脚本
    • make
    • make install

    执行以上操作后,Python 会安装在 /usr/local/bin 目录中,Python 库安装在 /usr/local/lib/pythonXX,XX 为你使用的 Python 的版本号。

    Window系统安装Python:

    以下为在 Window系统上安装Python 的简单步骤方法教程:

    • 打开 WEB 浏览器访问https://www.python.org/downloads/windows/

      Window系统安装Python
      Window系统安装Python

       

    • 在下载列表中选择Window平台安装包,包格式为:python-XYZ.msi 文件 , XYZ 为你要安装的版本号。
    • 要使用安装程序 python-XYZ.msi, Windows 系统必须支持 Microsoft Installer 2.0 搭配使用。只要保存安装文件到本地计算机,然后运行它,看看你的机器支持 MSI。Windows XP 和更高版本已经有 MSI,很多老机器也可以安装 MSI。

    Window系统安装Python
    Window系统安装Python

     

    • 下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。

    MAC 平台安装 Python:

    MAC 系统一般都自带有 Python2.x版本 的环境,你也可以在链接 https://www.python.org/downloads/mac-osx/ 上下载最新版安装。

    环境变量配置

    程序和可执行文件可以在许多目录,而这些路径很可能不在操作系统提供可执行文件的搜索路径中。
    path(路径)存储在环境变量中,这是由操作系统维护的一个命名的字符串。这些变量包含可用的命令行解释器和其他程序的信息。
    Unix或Windows中路径变量为PATH(UNIX区分大小写,Windows不区分大小写)。
    在Mac OS中,安装程序过程中改变了python的安装路径。如果你需要在其他目录引用Python,你必须在path中添加Python目录。

    在 Unix/Linux 设置环境变量

    • 在 csh shell: 输入 
      setenv PATH "$PATH:/usr/local/bin/python"
      , 按下"Enter"。
    • 在 bash shell (Linux): 输入 
      export PATH="$PATH:/usr/local/bin/python" 
      ,按下"Enter"。
    • 在 sh 或者 ksh shell: 输入 
      PATH="$PATH:/usr/local/bin/python" 
      , 按下"Enter"。
      

    注意: /usr/local/bin/python 是 Python 的安装目录。

    在 Windows 设置环境变量

    在环境变量中添加Python目录:

    在命令提示框中(cmd) : 输入 

    path=%path%;C:\Python 

    按下"Enter"。

    注意: C:\Python 是Python的安装目录。

    也可以通过以下方式设置:

    • 右键点击"计算机",然后点击"属性"
    • 然后点击"高级系统设置"
    • 选择"系统变量"窗口下面的"Path",双击即可!
    •  
    • 然后在"Path"行,添加python安装路径即可(我的D:\Python32),所以在后面,添加该路径即可。 ps:记住,路径直接用分号";"隔开!
    • 最后设置成功以后,在cmd命令行,输入命令"python",就可以有相关显示。
    【0基础学Python教程系列】(一)Python 环境搭建,包含Windows、Unix & Linux系统Python安装教程
    【0基础学Python教程系列】(一)Python 环境搭建,包含Windows、Unix & Linux系统Python安装教程。舆情管家在用

     

    Python 环境变量

    下面几个重要的环境变量,它应用于Python:

    变量名 描述
    PYTHONPATH PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。
    PYTHONSTARTUP Python启动后,先寻找PYTHONSTARTUP环境变量,然后执行此变量指定的文件中的代码。
    PYTHONCASEOK 加入PYTHONCASEOK的环境变量, 就会使python导入模块的时候不区分大小写.
    PYTHONHOME 另一种模块搜索路径。它通常内嵌于的PYTHONSTARTUP或PYTHONPATH目录中,使得两个模块库更容易切换。

    运行Python

    有三种方式可以运行Python:

    1、交互式解释器:

    你可以通过命令行窗口进入python并开在交互式解释器中开始编写Python代码。

    你可以在Unix,DOS或任何其他提供了命令行或者shell的系统进行python编码工作。

    $ python # Unix/Linux 
    
    或者 
    
    C:>python # Windows/DOS

    以下为Python命令行参数:

    选项 描述
    -d 在解析时显示调试信息
    -O 生成优化代码 ( .pyo 文件 )
    -S 启动时不引入查找Python路径的位置
    -V 输出Python版本号
    -X 从 1.6版本之后基于内建的异常(仅仅用于字符串)已过时。
    -c cmd 执行 Python 脚本,并将运行结果作为 cmd 字符串。
    file 在给定的python文件执行python脚本。

    2、命令行脚本

    在你的应用程序中通过引入解释器可以在命令行中执行Python脚本,如下所示:

    $ python script.py # Unix/Linux 
    
    或者 
    
    C:>python script.py # Windows/DOS

    注意:在执行脚本时,请检查脚本是否有可执行权限。

    到此关于:“【0基础学Python教程系列】(一)Python 环境搭建,包含Windows、Unix & Linux系统Python安装教程  结束。感谢阅读。部分参考与网络及软盟网

     

     

    展开全文
  • UNIX和类Unix操作系统

    万次阅读 2020-09-08 09:55:23
    UNIX和类Unix操作系统 Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。 Linux的起源可以追溯到古老的UNIX系统。正因为受到了UNIX的影响,才诞生了Linux。 Linux...

    UNIX和类Unix操作系统

    Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。
    Linux的起源可以追溯到古老的UNIX系统。正因为受到了UNIX的影响,才诞生了Linux。
    Linux继承了UNIX的许多优良传统,例如强大的网络功能、完善的命令以及良好的健壮性与稳定性。无论是从外观上,还是从功能上,UNIX与Linux都是非常相似的。
    #UNIX System V家族
        A/UX、AIX、HP-UX、IRIX、LynxOS、SCO OpenServer、Tru64、Xenix、Solaris、OS/2
    #BSD UNIX-386BSD家族
        BSD/OS、FreeBSD、NetBSD、NEXTSTEP、Mac OS X、iOS、OpenBSD、SUN OS、OpenSolaris
    #UNIX-Like
        GNU、Linux、Android、Debian、Ubuntu、Red Hat、Linux Mint、Minix、QNX、GNU/Linux、GNU/Hurd、Debian GNU/Hurd、GNU/kFreeBSD、StartOS
    #其他
        DOS、MS-DOS、Windows、React OS
    
    展开全文
  • Unix的特点

    千次阅读 2019-06-02 16:12:14
    UNIX操作系统,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,于1969年在AT&T的贝尔实验室开发。 Unix特点: Unix很简洁,仅仅提供 几百个系统调用并且...

    UNIX操作系统,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,于1969年在AT&T的贝尔实验室开发。
    Unix特点:

    1. Unix很简洁,仅仅提供 几百个系统调用并且设计目的十分明确。与其他系统动辄提供上千个系统调用,设计目的不明确形成十分鲜明的对比。
    2. 在Unix中所有东西都被当做文件对待。这种抽象使得对数据和对设备的操作都是通过一套相同 的系统调用接口来进行的:open()、read()、write()、lssek()、close()。
    3. Unix的内核和相关的系统工具都是用C语言编写的,让其在各种硬件架构中具有惊人的移植能力。
    4. Unix创建进程的速度非常快,并且有一个非常独特的fork()系统调用。
    5. Unix提供一套非常简单又稳定的进程间通信元语,方便把单一目的的程序组合在一起,去解决现实中变得越来越复杂的任务。

    今天,Unix已发展成为一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。Unix的不同变体被应用到数百个CPU的集群,和嵌入式设备等各种系统上。

    展开全文
  • 60行C代码的shell领略Unix哲学之美

    万次阅读 多人点赞 2019-09-10 16:29:49
    1969年,Unix初始,没有fork,没有exec,没有pipe,没有 “一切皆文件” ,但是那时它已经是Unix了。它简单,可塑。 Melvin Conway在1963年的论文中叙述fork思想时就解释说并行路径要用结果来交互,也就是在汇合的...

    来自《60行C代码实现一个shell》


    60行C代码实现一个shell。在实现它之前,先看看这样做的意义。

    美是有目共睹的。Unix之美,稍微体会,便能得到。

    1969年,Unix初始,没有fork,没有exec,没有pipe,没有 “一切皆文件” ,但是那时它已经是Unix了。它简单,可塑。

    Melvin Conway在1963年的论文中叙述fork思想时就解释说并行路径要用结果来交互,也就是在汇合的join点来同步结果。这个同步点所得到的,就是一个并行进程的 输出

    在此之外,Unix还有另一个原则,就是 组合小程序!

    Unix把一系列功能单一的小程序组合成一个复杂的逻辑,这个原则有以下优势:

    • 每一个小程序都很容易编写。
    • 每一个小程序可以分别完成。
    • 每一个小程序可以分别迭代修复。
    • 多个小程序可以自由组合。

    这是典型的模块化思想,小到统筹佐餐烧饭,大到组成生命的嘌呤嘧啶,都不自觉地和这种模块化思想相契机,原来这就是真理。 程序尽量小,只做一件事并且做好它。

    Unix程序在自身的逻辑之外对外暴露的只有输入和输出。那么 用输出连接另一个程序输入 就是一种好的方法。所谓Conway的join点对于Unix进程指的就是输出。

    对外暴露的越少,程序越内聚。这是一种范式,类似RISC处理器也是抽象出仅有的load和store来和内存交互。

    简单来讲,Unix程序通过输入和输出来彼此连接。下面是一幅来自Wiki的图示:
    在这里插入图片描述
    详见Pipeline (Unix):
    https://en.wikipedia.org/wiki/Pipeline_(Unix)

    Unix的另一个原则,即著名的 “一切皆文件!” 连接输出和输入的那个管道在Unix中被实现为Pipe,显然,它也是文件,一个FIFO文件。

    说实话,协作几个小程序形成一个大逻辑的思想还是来自于Convey,在Convey的论文里,他称为 协程, Pile可以说是直接实现了 Convey协程 之间的交互。有关这段历史,请看:
    http://www.softpanorama.org/Scripting/Piporama/history.shtml

    用Pipe连接作为输出和输入连接Unix进程可以做成什么事情呢?让我们去感受一个再熟悉不过的实例,即数学式子:

    (3+5)×76\dfrac{(3+5)\times 7}{6}

    我们把运算符加号,乘号,除号(暂不考虑括号,稍后解释为什么)这些看作是程序(事实上它们也真的是),那么类似数字3,5,7,6就是这些程序的输入了,这个式子最终需要一个输出,获得这个输出的过程如下:

    1. 数字3,5是加号程序的输入,3+5执行,它获得输出8.
    2. 第1步中的输出8连同数字7作为乘号程序的输入,8×78\times 7执行,获得输出56.
    3. 第2步中的输出56连同数字6作为除号的输入,…

    这个数学式子的求值过程和pipe连接的Unix程序组合获得最终结果的过程完全一致。

    如果你相信数学可以描述整个世界,那么Pipe连同Unix程序同样是描述这个世界的语言 。

    在数学领域,程序 就是所有的运算符,加号,减号,乘号,除号,乘方,开方,求和,积分,求导…它们无一例外, 只做一件事。

    在Unix看来也同样。它做的事情和下面的应该差不多,而且更多:
    在这里插入图片描述
    写出上面的式子中每一个数学运算符的程序并不困难,比如加号程序:

    // plus.c
    #include <stdio.h>
    int main(int argc, char **argv)
    {
    	int a, b;
    
    	a = atoi(argv[1]);
    	b = atoi(argv[2]);
    
    	a = a + b;
    	printf("%d\n", a);
    }
    

    同样,我们可以写出除法,直到偏导的程序。然后我们通过pipe就能将它们组合成任意的数学式子。

    现在谈谈Unix组合程序的具体写法,如果我们要化简薛定谔方程,我们应该如何用Unix命令写出与上述式子等价的组合程序命令行呢?我们无法像数学家手写那样随意使用括号,显然,计算机并不认识它。我们能够使用的只有两个符号:

    1. 代表具体Unix小程序的命令。
    2. Pipe符号"|"。

    换句话说,我们需要写出一个 链式组合表达式。 这时就要用到前缀表达式了。

    数学式子里的括号,其实它无关紧要,括号只是给人看的,它规定一些运算的优先级顺序,这叫 中缀表达式 ,一个中缀表达式可以轻松被转换为 前缀表达式,后缀表达式 ,从而消除括号。事实上,Unix的Pipe最初也面临过这样的问题,到底是中缀好呢,还是前/后缀好呢?

    我们现在使用的Unix/Linux命令,以cp举例:

    cp $in $out
    

    这是一个典型的前缀表达式,但是当pipe的发明者McIlroy最初引入pipe试图组合各个程序时,最初上面的命令行被建议成:

    $in cp $out
    

    就像我们的 (3+5)×8(3+5)\times 8一样。但是这非常不适合计算机处理的风格,计算机不得不首先扫描解析这个式子,试图:

    1. 理解 “括号括起来的要优先处理” 这句复杂的话;
    2. 区分哪些是输入,哪些是操作符…

    对于式子(3+5)×8(3+5)\times 8的求值,计算机更适合用一种在简单规则下非常直接的方式去 顺序执行 求解,这就是前缀表达式的优势。

    ×8+35\times 8+35就是(3+5)×8(3+5)\times 8的前缀表达式,可以看到,没有了括号。对于pipe组合程序而言,同样适用于这个原则。于是前缀命令成了pipe组合命令的首选,现如今,我们可以用:

    pro1 $stdin|pro2|pro3|pro4|...|proX $stdout
    

    轻松组合成任意复杂的逻辑。

    Pipe协同组合程序的Unix原则是一个创举,程序就是一个加工过滤器,它把一系列的输入经过自己的程序逻辑生成了一系列的输出,该输出又可以作为其它程序的输入。

    在Unix/Linux中,各种shell本身就实现了这样的功能,但是为了彻底理解这种处理方式的本质,只能自己写一个才行。来写一个微小的shell吧。

    再次看上面提到的Unix Pipe的处理序列:

    pro1 $stdin|pro2|pro3|pro4|...|proX $stdout
    

    如果让一个shell处理以上组合命令,要想代码量少,典型方案就是递归,然后用Pipe把这些递归调用过程给串起来,基本逻辑如下:

    int exec_cmd(CMD *cmd, PIPE pipe)
    {
        // 持续解析命令行,以pipe符号|分割每一个命令
        while (cmd->next) {
            PIPE pp = pipe_create();
            if (fork() > 0) {
                // 父进程递归解析下一个
                exec_cmd(cmd->next, pp);
                return 0;
            }
            // 子进程执行
            dup_in_out(pp);
            exec(cmd->cmdline);
        }
        if (fork() > 0) {
            wait_all_child();
            return 0;
        } else {
            dup_in_out(pp);
            exec(cmd->cmdline);
        }
    }
    

    按照上面的思路实现出来,大概60行左右代码就可以:

    // tinysh.c
    // gcc tinysh.c -o tinysh
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    #define CMD_BUF_LEN	512
    char cmd[CMD_BUF_LEN] = {0};
    
    void fork_and_exec(char *cmd, int pin, int pout)
    {
        if (fork() == 0) {
            if (pin != -1) {
                dup2 (pin, 0);
                close(pin);
            }
            if (pout != -1) {
                dup2 (pout, 1);
                close(pout);
            }
            system(cmd);
            exit(0);
        }
    	if (pin != -1)
    		close(pin);
    	if (pout != -1)
    		close(pout);
    }
    
    int execute_cmd(char *cmd, int in)
    {
    	int status;
    	char *p = cmd;
    	int pipefd[2];
    
    	while (*p) {
    		switch (*p) {
    		case '|':
    			*p++ = 0;
    			pipe(pipefd);
    			fork_and_exec(cmd, in, pipefd[1]);
    			execute_cmd(p, pipefd[0]);
    			return 0;
    		default:
    			p++;
    		}
    	}
    	fork_and_exec(cmd, in, -1);
    	while(waitpid(-1, &status, WNOHANG) != -1);
    	return 0;
    }
    
    int main(int argc, char **argv)
    {
    	while (1) {
    		printf("tiny sh>>");
    		gets(cmd);
    		if (!strcmp(cmd, "q")) {
    			exit(0);
    		} else {
    			execute_cmd(cmd, -1);
    		}
    	}
    	return 0;
    }
    

    下面是执行tinysh的结果:

    [root@10 test]# ls -l
    总用量 28
    -rw-r--r-- 1 root root    0 9月   1 05:39 a
    -rwxr-xr-x 1 root root 9000 9月   1 05:38 a.out
    -rw-r--r-- 1 root root    0 9月   1 05:39 b
    -rw-r--r-- 1 root root    0 9月   1 05:39 c
    -rw-r--r-- 1 root root    0 9月   1 05:39 d
    -rw-r--r-- 1 root root    0 9月   1 05:39 e
    -rwxr-xr-x 1 root root 9000 9月   1 05:38 tinysh
    -rw-r--r-- 1 root root 1167 9月   1 05:38 tinysh.c
    [root@10 test]# ./tinysh
    tiny sh>>ls -l |wc -l
    9
    tiny sh>>cat /etc/inittab |grep init
    # inittab is no longer used when using systemd.
    tiny sh>>cat /etc/inittab |grep init|wc -l
    1
    tiny sh>>q
    [root@10 test]#
    

    递归解析的过程中fork/exec,一气呵成,这就是一个最简单shell实现。它可完成组合程序的执行并给出结果。

    这个tiny shell命令解析器的逻辑可以表示如下:
    在这里插入图片描述
    现在,让我们用上面的tiny shell来实现式子(3+5)×7206\dfrac{(3+5)\times 7-20}{6}的计算,我需要写表示四则混合运算符的Unix程序,首先看加号运算符程序,将上文中plus.c改成从标准输入读取加数即可:

    // plus.c
    // gcc plus.c -o plus
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
    	float a, b;
    
    	a = atof(argv[1]);
    	scanf("%f", &b);
    
    	b = b + a;
    	printf("%f\n", b);
    }
    

    再看减法运算符程序代码:

    // sub.c
    // gcc sub.c -o sub
    #include <stdio.h>
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
    	float a, b;
    
    	a = atof(argv[1]);
    	scanf("%f", &b);
    
    	b = b - a;
    	printf("%f\n", b);
    }
    

    接下来是乘法和除法的代码:

    // times.c
    // gcc times.c -o times
    #include <stdio.h>
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
    	float a, b;
    
    	a = atof(argv[1]);
    	scanf("%f", &b);
    
    	b = b*a;
    	printf("%f\n", b);
    }
    
    // div.c
    // gcc div.c -o div
    #include <stdio.h>
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
    	int a, b;
    
    	a = atof(argv[1]);
    	scanf("%d", &b);
    
    	b = b/a;
    	printf("%d\n", b);
    }
    

    可以看到,这些都是非常简单的程序,但是任意组合它们便可以实现任意四则运算,我们看看(3+5)×7206\dfrac{(3+5)\times 7-20}{6}这个如何组合。

    首先在标准的Linux bash中我们试一下:

    [root@10 test]# ./plus 5|./times 7|./sub 20|./div 6
    3
    6.000000
    [root@10 test]#
    

    计算结果显然是正确的。现在我在自己实现的tinysh中去做类似的事情:

    [root@10 test]# ./tinysh
    tiny sh>>./plus 5|./times 7|./sub 20|./div 6
    3
    6.000000
    tiny sh>>q
    [root@10 test]#
    

    可以看到,tinysh的行为和标准Linux bash的行为是一致的。

    简单吧,简单!无聊吧,无聊!Pipe连接了若干小程序,每一个小程序只做一件事。

    如果我们的系统中没有任何shell程序,比如我们没有bash,我们只有tinysh,加上以上这4个程序,一共5个程序,就可以完成任意算式的四则混合运算。

    现在我们用以上的组合Unix程序的方法试试计算下面的式子:

    3+92\dfrac{3+\sqrt{9}}{2}

    根号怎么办?

    按照非Unix的编程风格,就要在程序里写函数计算开根号,但是用Unix的风格,则只需要再加个开根号的程序即可:

    // sqrt.c
    // gcc sqrt.c -lm -o sqrt
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main(int argc, char *argv[])
    {
    	float b;
    
    	scanf("%f", &b);
    
    	b = sqrt(b);
    	printf("%f\n", b);
    }
    

    有了这个开根号的程序,结合已经有的四则运算程序,让我们的tinysh用pipe将它们串起来,就成了。好了,现在让我们计算上面的式子:

    ./tinysh
    tiny sh>>./sqrt |./plus 3|./div 2
    9
    3.000000
    tiny sh>>q
    

    本文该结束了,后面要写的应该就是关于经典Unix IPC的内容了,是的,自从Pipe之后,Unix便开启了IPC,System V开始称为标准并持续引领着未来,但这是另一篇文章的话题了。

    最后,来自Unix初创者之一Dennis M. Ritchie关于Unix的满满回忆,非常感人:
    在这里插入图片描述
    这个美段来自 The Evolution of the Unix Time-sharing System
    http://www.read.seas.harvard.edu/~kohler/class/aosref/ritchie84evolution.pdf


    浙江温州皮鞋湿,下雨进水不会胖!

    展开全文
  • Linux和Unix的区别

    千次阅读 2019-09-13 09:11:03
    我其实非常想了解一些关于Unix的事情,比如某个命令,比如某种机制的实现。我对此热情不减,好几年了。 然而很难。我只要搜一些关于这方面的东西,结果全都是关于Linux的,搞得好像Linux就是Unix似的。这让我不得...
  • unixbench

    千次阅读 2019-05-13 10:07:24
    安装过程 ...wget http://soft.laozuo.org/scripts/UnixBench5.1.3.tgz 或通过网盘下载 链接:https://pan.baidu.com/s/1KnHn_xBoUjXInvsOBEYE_A 提取码:2jmw 复制这段内容后打开百度网盘手机Ap...
  • Unix、Posix和标准UniX规范

    千次阅读 2017-06-03 18:14:40
    Unix、Posix和标准UniX规范
  • leetcode71. 简化路径 Unix 风格

    千次阅读 2020-02-22 00:41:30
    Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..)表示将目录切换到上一级(指向父目录);...
  • UNIX环境高级编程(中文第三版)

    千次下载 热门讨论 2016-04-13 08:29:14
    UNIX环境高级编程(第3版)》是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的第3版。在本书第2版出版后的8年中,UNIX行业发生了巨大的变化,特别是影响UNIX编程接口的有关标准变化...
  • unix时间戳

    千次阅读 2018-12-25 11:35:43
    unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。  UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.  一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为...
  • 关于unix下的相关问题

    2016-03-10 04:59:51
    本人学习软件一段时间了,但是又感觉没有入门,接触的主要是C语言,unix和linux系统 也接触了近两年时间,但是并没有感觉到unix/linux的强大和优越, 鸟哥私房菜读完大概,也动手实践过、unix编程环境读完,但是就是...
  • Unix和UnixNano

    2020-03-24 21:05:22
    Unix将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)。 在windows下,rand.Seed(time.Now().Unix())作为种子,得出的随机数是随机的 func (t Time) Unix() int64 UnixNano将t...
  • Unix时间戳

    千次阅读 2018-09-29 13:02:04
    Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 在线查询Unix时间戳 http://tool.chinaz.com/Tools/unixtime.aspx 百度百科 https://baike.baidu.com/item/unix时间戳/2...
  • UNIX/Linux历史简介

    千次阅读 2018-12-01 20:39:19
    今天是2018年12月01日,我正式住入新租的房子。陆陆续续搬了一个星期的东西,倒不是因为东西多,只是太纵容自己的惰性了,这不能够!新的住处间隔旧住处只是差了一条街道,走楼梯8楼,虽然出入辛苦点,但是光线还算...
  • 最近心血来潮看到了一本有意思的书:《Unix内核源码剖析》。这本书有意思之处在于,作者的研究对象是 Unix V6。虽然 Unix V6 已经是 1975 年的系统了,但是其源代码拢共只有 1w 行左右,并且使用了 C 语言(K & ...
  • Unix的Shell重定向

    千次阅读 2020-02-06 10:40:03
    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况...
  • HIVE中的from_unixtime函数

    万次阅读 2019-01-28 09:53:55
    hive中的from_unixtime()函数,可以把时间戳格式的时间,转化为年月日时分秒格式的时间。 from_unixtime的参数要求为整数,且单位为秒。 如果从业务系统拿到的时间戳格式的时间单位为毫秒,则需要先将它转化为秒,...
  • 文章目录一、UnixPOSIX标准二、MacOS三、类Unix/Unix-likeGNU/Linux四、DOS&Windows系列windows家族表在这里插入图片描述所有操作系统图谱==如果您喜欢我的博客,欢迎加入QQ群交流开发技术 -- '300567032'== ...
  • Unix/Linux fork/exec的前世今生

    千次阅读 2019-09-04 14:12:34
    本文是《Linux fork那些隐藏的开销》的前传《Unix/Linix fork前传》。转载注明来自公众号“Linux阅码场”。 昨天(好像是上周的事了,暴雨天?),我发了个朋友圈,承诺给大家扒拉扒拉fork和exec的历史,顺便说一下...
  • 随着读者的数量越来越多,总不免被问到一些“面向搜索引擎”的问题,比如说:“Java 怎么与 Unix 时间戳互转啊?”期初我很受不了,问得多了我就习惯了,于是就打算把这些小知识点统一写成文章,到时候直接扔给读者...
  • 可怕,hive版本1.2.1,实践中发现,to_unix_timestamp比unix_timestamp函数快几十甚至上百倍!!!
  • 众所周知,数字整型用来大小比较和计算运算要比字符型快的多,因此部分业务需要把时间字段转化为整型方便业务的快速计算和到达,这个整形数字是选定的日期距UTC...这里就需要两个函数来进行转换UNIX_TIMESTAMP和FRO...
  • unix2dos批量转换工具(双向) MS桌面版 前一版描述较不祥细,以至于很同朋友不知道可以选择多个文件拖放,故在此多啰嗦几句。 注明:1、窗口支持拖放,单文件或多文件同时拖放均可 2、新版本添加文件列表窗口中点...
  • C#时间戳 unix

    2019-06-02 10:45:21
    /// <summary> /// Unix时间戳转为C#格式时间 /// </summary> /// <param name="timeStamp">Unix时间戳格式,例如1482115779</param> /// <returns>...
  • Unix的起源

    千次阅读 2016-11-25 11:35:45
    不得不说的 Unix【内容摘要】 Unix诞生于1969年,此后快速被广泛应用; Unix一开始是开源的,后来AT&T收回版权,并且不公开源代码; Unix的代码是由90%的C语言和10%的汇编组成; Unix后来的两大分支:AT&T的System V...
  • 虽然没有UNIX/Linux fork那般久远,本文的主角select也是一个直到今天我们还在使用的系统调用。 由于周末要做家务,带孩子,还要24小时钉钉oncall,一个演员的自我修养就是要在不同的时空穿越演出(PS:我写这些是...
  • UNIX时间戳函数

    2019-04-22 19:03:33
    UNIX_TIMESTAMP(date)若无参数调用,则返回一个Unix时间戳(‘1970-01-01 00:00:00’)作为无符号整数。 例1:使用UNIX_TIMESTAMP函数返回UNIX格式的时间戳,输入语句如下: mysql> select unix_timestamp(),unix...
  • UNIX SOCKET简介

    万次阅读 2018-11-17 15:23:27
    UNIX Domain SOCKET 是在Socket架构上发展起来的用于同一台主机的进程间通讯(IPC)。它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序列号应答等。只是将应用层数据从一个进程拷贝到另一个进程。UNIX ...

空空如也

1 2 3 4 5 ... 20
收藏数 183,096
精华内容 73,238
关键字:

unix