此篇文章主要会带你介绍Linux操作,包括Linux本身、Linux怎样使用、以及系统调用和Linux是怎样工作的。
Linux简介
UNIX是一个交互式系统,用于同时处理多进程和多用户同时在线。为何要说UNIX,那是由于Linux是由UNIX发展而至的,UNIX是由程序员设计,它的主要服务对象也是程序员。Linux承继了UNIX的设计目标。从智能手机到车辆,超级计算机和家用家电,从家用台式机到企业服务器,Linux操作系统无处不在。
大多数程序员都喜欢让系统尽量简单,典雅并具有一致性。举个反例,从最底层的角度来讲,一个文件应当只是一个字节集合。为了实现次序存取、随机存取、按键存取、远程存取只能是阻碍你的工作。相同的,假如
ls A*
意味着只列举以A为开头的所有文件,这么
rm A*
应当会移除所有以A为开头的文件而不是只删掉文件名是A*的文件。这个特点也是最小食惊原则(principleofleastsurprise)
最小食惊原则一半常用于用户界面和软件设计。它的原型是:该功能或则特点应当符合用户的预期,不应当使用户倍感震惊和惊讶。
一些有经验的程序员一般希望系统具有较强的功能性和灵活性。设计Linux的一个基本目标是每位应用程序只做一件事情并把他做好。所以编译器只负责编译的工作,编译器不会形成列表,由于有其他应用比编译器做的更好。
好多人都不喜欢冗余,为何在cp能够描述清楚你想干哪些时侯还使用copy?这完全是在浪费宝贵的hackingtime。为了从文件中提取所有包含字符串ard的行,Linux程序员应当输入
grep ard f
Linux插口
Linux系统是一种金字塔模型的系统,如下所示
应用程序发起系统调用把参数放到寄存器中(有时侯置于栈中),并发出trap系统深陷指令切换用户态至内核态。由于不能直接在C中编撰trap指令,因而C提供了一个库,库中的函数对应着系统调用。有些函数是使用汇编编撰的,而且还能从C中调用。每位函数首先把参数放到合适的位置之后执行系统调用指令。因而假如你想要执行read系统调用的话,C程序会调用read函数库来执行。这儿顺便提一下,是由POSIX指定的库插口而不是系统调用插口。也就是说,POSIX会告诉一个标准系统应当提供什么库过程,它们的参数是哪些,它们必须做哪些以及它们必须返回哪些结果。
不仅操作系统和系统调用库外,Linux操作系统还要提供一些标准程序,例如文本编辑器、编译器、文件操作工具等。直接和用户打交道的是里面那些应用程序。因而我们可以说Linux具有三种不同的插口:系统调用插口、库函数插口和应用程序插口
Linux中的GUI(GraphicalUserInterface)和UNIX中的特别相像,这些GUI创建一个桌面环境,包括窗口、目标和文件夹、工具栏和文件拖放功能。一个完整的GUI还包括窗口管理器以及各类应用程序。
Linux上的GUI由X窗口支持,主要组成部份是X服务器、控制按键、鼠标、显示器等。当在Linux上使用图形界面时,用户可以通过键盘点击运行程序或则打开文件,通过拖放将文件进行复制等。
Linux组成部份
事实上,Linux操作系统可以由下边这几部份构成
虽然Linux应用程序提供了GUI,而且大部份程序员仍偏好于使用行(command-lineinterface),称为shell。用户一般在GUI中启动一个shell窗口之后就在shell窗口下进行工作。
shell命令行使用速率快、功能更强悍、而且便于扩充、并且不会带来肢体重复性胃炎(RSI)。
下边会介绍一些最简单的bashshell。当shell启动时,它首先进行初始化,在屏幕上输出一个提示符(prompt),一般是一个百分号或则欧元符号,等待用户输入
等用户输入一个命令后,shell提取其中的第一个词,这儿的词指的是被空格或制表符分隔开的一连串字符。假设这个词是即将运行程序的程序名,这么都会搜索这个程序,假若找到了这个程序都会运行它。之后shell会将自己挂起直至程序运行完毕,然后再尝试读入下一条指令。shell也是一个普通的用户程序。它的主要功能就是读取用户的输入和显示估算的输出。shell命令中可以包含参数,它们作为字符串传递给所调用的程序。诸如
cp src dest
会调用cp应用程序并包含两个参数src和dest。这个程序会解释第一个参数是一个早已存在的文件名,之后创建一个该文件的副本,名称为dest。
并不是所有的参数都是文件名,例如下边
head -20 file
第一个参数-20,会告诉head应用程序复印文件的前20行,而不是默认的10行。控制命令操作或则指定可选值的参数称为标志(flag),依照惯例标志应当使用-来表示。这个符号是必要的,例如
head 20 file
是一个完全合法的命令,它会告诉head程序输出文件名为20的文件的前10行,之后输出文件名为file文件的前10行。Linux操作系统可以接受一个或多个参数。
为了更容易的指定多个文件名,shell支持魔法字符(magiccharacter),也被称为键值(wildcards)。例如,*可以匹配一个或则多个可能的字符串
ls *.c
告诉ls列列举所有文件名以.c结束的文件。若果同时存在多个文件,则会在旁边进行并列。
另一个键值是问号,负责匹配任意一个字符。一组在中括弧中的字符可以表示其中任意一个,为此
ls [abc]*
会列列举所有以a、b或则c开头的文件。
shell应用程序不一定通过终端进行输入和输出。shell启动时,才会获取标准输入、标准输出、标准错误文件进行访问的能力。
标准输出是从鼠标输入的,标准输出或则标准错误是输出到显示器的。许多Linux程序默认是从标准输入进行输入并从标准输出进行输出。诸如
sort
会调用sort程序,会从终端读取数据(直至用户输入ctrl-d结束),按照字母次序进行排序,之后将结果输出到屏幕上。
一般还可以重定向标准输入和标准输出,重定向标准输入使用进行重定向。容许一个命令中重定向标准输入和输出。诸如命令
sort out
会使sort从文件in中得到输入,并把结果输出到out文件中。因为标准错误没有重定向,所以错误信息会直接复印到屏幕上。从标准输入读入,对其进行处理并将其写入到标准输出的程序称为过滤器。
考虑下边由三个分开的命令组成的指令
sort temp;head -30 <temp;rm temp
首先会调用sort应用程序,从标准输入in中进行读取,并通过标准输出到temp。当程序运行完毕后,shell会运行head,告诉它复印前30行虚拟主机 linux,并在标准输出(默认为终端)上复印。最后,temp临时文件被删掉。轻轻的,你走了linux操作系统分区,你挥一挥袖子,不带走一片云彩。
命令行中的第一个程序一般会形成输出,在前面的事例中,形成的输出都不temp文件接收。但是,Linux还提供了一个简单的命令来做这件事,比如下边
sort <in | head -30
里面|称为竖线符号,它的意思是从sort应用程序形成的排序输出会直接作为输入显示,无需创建、使用和移除临时文件。由管线符号联接的命令集合称为管线(pipeline)。诸如如下
grep cxuan *.c | sort | head -30 | tail -5 >f00
对任意以.t结尾的文件中包含cxuan的行被讲到标准输出中,之后进行排序。那些内容中的前30行被head下来并传给tail,它又将最后5行传递给foo。这个事例提供了一个管线将多个命令联接上去。
可以把一系列shell命令放到一个文件中,之后将此文件作为输入来运行。shell会依照次序对她们进行处理linux操作系统分区,如同在按键上键入命令一样。包含shell命令的文件被称为shell(shellscripts)。
推荐一个shell命令的学习网站:
shell当然也是一段程序,shell脚本中可以对变量进行形参,也包含循环控制句子诸如if、for、while等,shell的设计目标是让其看上去和C相像(ThereisnodoubtthatCisfather)。因为shell也是一个用户程序,所以用户可以选择不同的shell。
Linux应用程序
Linux的命令行也就是shell,它由大量标准应用程序组成。那些应用程序主要有下边六种
不仅这种标准应用程序外,还有其他应用程序例如Web浏览器、多媒体播放器、图片浏览器、办公软件和游戏程序等。
我们在前面的事例中早已见过了几个Linux的应用程序,例如sort、cp、ls、head,下边我们再来认识一下其他Linux的应用程序。
我们先从几个事例开始讲起,例如
cp a b
是将a复制一个副本为b,而
mv a b
是将a联通到blinux查看端口占用,并且删掉原文件。
前面这两个命令有一些区别,cp是将文件进行复制,复制完成后会有两个文件a和b;而mv相当于是文件的联通,联通完成后就不再有a文件。cat命令可以把多个文件内容进行联接。使用rm可以删掉文件;使用chmod可以容许所有者改变访问权限;文件目录的的创建和删掉可以使用mkdir和rmdir命令;使用ls可以查看目录文件,ls可以显示好多属性,例如大小、用户、创建日期等;sort决定文件的显示次序
Linux应用程序还包括过滤器grep,grep从标准输入或则一个或多个输入文件中提取特定模式的行;sort将输入进行排序并输出到标准输出;head提取输入的前几行;tail提取输入的前面几行;除此之外的过滤器还有cut和paste,容许对文本行的剪切和复制;od将输入转换为ASCII;tr实现字符大小写转换;pr为低格复印输出等。
程序编译工具使用gcc;
make命令用于手动编译,这是一个很强悍的命令,它用于维护一个大的程序,常常这类程序的源码由许多文件构成。典型的,有一些是headerfiles头文件,源文件一般使用include指令包含那些文件,make的作用就是跟踪什么文件属于头文件,之后安排手动编译的过程。
下边列举了POSIX的标准应用程序
程序应用
ls
列举目录
cp
复制文件
head
显示文件的前几行
make
编译文件生成二补码文件
cd
切换目录
mkdir
创建目录
chmod
更改文件访问权限
ps
列举文件进程
pr
低格复印
rm
删掉一个文件
rmdir
删掉文件目录
tail
提取文件最后几行
tr
字符集转换
grep
分组
cat
将多个文件连续标准输出
od
以八补码显示文件
cut
从文件中剪切
paste
从文件中粘贴
Linux内核结构
在前面我们看见了Linux的整体结构,下边我们从整体的角度来看一下Linux的内核结构
内核直接位于在硬件上,内核的主要作用就是I/O交互、内存管理和控制CPU访问。上图中还包括了中断和调度器,中断是与设备交互的主要方法。中断出现时调度器都会发挥作用。这儿的低级代码停止正在运行的进程,将其状态保存在内核进程结构中,并启动驱动程序。进程调度也会发生在内核完成一些操作而且启动用户进程的时侯。图中的调度器是dispatcher。
注意这儿的调度器是dispatcher而不是scheduler,这三者是有区别的
scheduler和dispatcher都是和进程调度相关的概念,不同的是scheduler会从几个进程中随便选定一个进程;而dispatcher会给scheduler选择的进程分配CPU。
之后,我们把内核系统分为三部份。
从图中可以看出I/O层次的关系,最高层是一个虚拟文件系统,也就是说不管文件是来自显存还是c盘中,都是经过虚拟文件系统中的。从底层看,所有的驱动都是字符驱动或则块设备驱动。两者的主要区别就是是否容许随机访问。网路驱动设备并不是一种独立的驱动设备,它实际上是一种字符设备,不过网络设备的处理方法和字符设备不同。
里面的设备驱动程序中,每位设备类型的内核代码都不同。字符设备有两种使用方法,有一键式的诸如vi或则emacs,须要每一个按键输入。其他的例如shell,是须要输入一行按回车键将字符串发送给程序进行编辑。
网路软件一般是模块化的,由不同的设备和合同来支持。大多数Linux系统在内核中包含一个完整的硬件路由器的功能,而且这个不能和外部路由器相比,路由器里面是合同栈,包括TCP/IP合同,合同栈里面是socket插口,socket负责与外部进行通讯,充当了门的作用。
c盘驱动里面是I/O调度器,它负责排序和分配c盘读写操作,以尽可能降低盘片的无用联通。
在内核最顶楼的是系统调用插口,所有的系统调用都是经过这儿,系统调用会触发一个trap,将系统从用户态转换为内核态,之后将控制权移交给前面的内核部件。
良许个人陌陌
添加良许个人陌陌即送3套程序员必看资料
→精选技术资料共享
→高手如云交流社群
本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
本文原创地址://gulass.cn/gylczxtdyxxz.html编辑:刘遄,审核员:暂无