Ubuntu学习笔记

1.进入命令行的方法:
alt+ctrl+f1进入命令行的全屏。
通过Ctrl+Alt+(F1,F2,F3,F4,F5,F6)进行六个虚拟控制台之间的切换,可以通过Ctrl+Alt+F7回到图形界面。
2.开机过程:BIOS -> MBR(master boot record,主引导记录) -> boot loader -> kernel -> init process -> login
3.我们可以在多个分区安装boot loader,每个boot loader对应不同的操作系统,在读取MBR的时候选择我们想要启动的boot loader。这就是多操作系统的原理。
4.硬连接(hard link)&软连接(soft link)&删除文件(remove unlink)&连接数目(link count)
当文件出现在一个目录文件中时,我们就把文件接入到文件系统中,我们称建立一个到文件的硬链接(hard link)。一个文件允许出现在多个目录中,这样,它就有多个硬链接。当硬链接的数目(link count)降为0时,文件会被Linux删除。所以很多时候,unlink与remove在Linux操作系统中是一个意思。由于软链接(soft link)的广泛使用(soft link不会影响link count,而且可以跨越文件系统),现在较少手动建立硬连接。
5.文件权限的信息保存在文件信息(metadata)中
文件自身包含的只有数据。文件名实际上储存在目录文件。除了这些之外,还有操作系统维护的文件附加信息,比如文件类型,文件尺寸,文件权限,文件修改时间,文件读取时间等。
6.软连接(soft link)
如果还记得windows系统的快捷方式的话,Linux的软链接(soft link,也叫做symbolic link)就是linux的快捷方式。
7.Linux首先启动内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。为了方便调用内核,Linux将内核的功能接口制作成系统调用(system call)。
8.System Call
Linux有两百多个系统调用,系统调用是操作系统的最小功能单位。一个操作系统,以及基于操作系统的应用,都不可能实现超越系统调用的功能。一个系统调用函数就像是汉字的一个笔画。任何一个汉字都要由基本的笔画(点、横、撇等等)构成。
9.Library Routine
系统调用提供的功能非常基础,所以使用起来很麻烦。一个简单的给变量分配内存空间的操作,就需要动用多个系统调用。Linux定义一些库函数(library routine)来将系统调用组合成某些常用的功能。
库函数就像是汉字的偏旁部首,它由笔画组成,但使用偏旁部首更容易组成字,比如"铁"。当然,你也完全可以不使用库函数,而直接调用系统函数,就像“人”字一样,不用偏旁部首。
NOTE:其实这里作者可能讲的不是很恰当。LibraryRoutine就是将SystemCall封装了一下,调用的粒度变大了。
10.一个操作系统要称得上是UNIX系统,必须要拥有一些库函数,比如ISO C标准库,POSIX标准等。
11.关于权限
Linux规定: 4为有读取的权利,2为有写入的权利,1为有执行的权利。
12.关于文件执行权限
如755:对应三个组,7被分配给拥有者,5被分配给拥有组,最后一个5分配给其它用户。我们看到的7实际上是4 + 2 + 1,表示拥有者有读、写、执行三项权利。
13.关于查询文件权限的另一个解读
用ls命令查询文件信息($ls -l file.txt),得到如下结果:-rw-r--r-- 1 vamei vamei 8445 Sep 8 07:33 file1.txt
解读:最开始的-,它表示文件类型,说明file1.txt是常规文件(如果是目录文件,则应显示d)。有九个字符,为rw-r--r--,它们用于表示文件权限。这九个字符分为三组,rw-, r--, r--,分别对应拥有者(owner),拥有组(owner group)和所有其他人(other)。第一组表示,如果我的名片上的用户身份证明我是该文件的拥有者,那么我就可以对该文件有读取(r),写入(w)该文件的权限,但不拥有执行(-,如果拥有执行权限,则为x)该文件的权限。第二组表示,如果我的名片上的组身份证明我所在的组是该文件的拥有组的一员,那么我有从该文件读入的权限。第三组表示,如果我的名片显示我既不是拥有者,也不是拥有组的一员,那么我只有读入的权限。当我想要进行一个读取操作时,Linux会先看我是否是拥有者下文会进一步解释拥有者和拥有组。
后面的1是硬连接(hard link)数目(link count)。
之后的vamei表示用户vamei是文件的拥有者(owner),文件的拥有者有权更改文件权限(比如改为rwxrwxrwx)。而后面的vamei文件的拥有组是组vamei。文件的拥有者和拥有组在文件创建时就附加在文件上(相当于给文件上锁,只有有合适名片的用户才能打开操作)。要注意,Linux有一个超级用户root (也叫做根用户),该用户拥有所有的文件。
随后的8445表示文件大小,单位为字节(byte)。
Sep 8 07:33表示文件的上一次写入的时间(modification time)。实际上在文件附加信息中还包含有文件的上一次读取时间(access time),没有显示出来。

14.通配符
* 任意多个任意字符

? 任意一个字符

[kl] 字符k或者字符l

[0-4] 数字0到4字符中的一个

[b-e] b到e字符中的一个

[^mnp] 一个字符,这个字符不是m,n,p

15.Linux为什么以字节为单位处理所有文件
这是为了让所有文件能够公用一套接口(virtual file system),从而减少Linux设计的复杂度。
"everything is a file"是通常所流传的UNIX设计的哲学之一,但Linus对此作出纠正,改为"everything is a stream of bytes"
steam of bytes文本流,字节流

16.当Linux执行一个程序的时候,会自动打开三个流,标准输入(standard input),标准输出(standard output),标准错误(standard error)。

17.假设我们不想让文本流流到屏幕,而是流到另一个文件,我们就采用重新定向(redirect)的机制。EX: $ls>a.txt

18.两个重定向符号:第一个是> 他每次都会新建一个文件来记录文本流,另一个是>> 他是将产生的文本流附加在已经存在的文件的结尾

19.管道(pipe)
管道可以将一个命令的输出导向另一个命令的输入,从而让两个(或者更多命令)像流水线一样连续工作,不断地处理文本流。用|表示管道

20.关于wc
word count,用于统计文本中的行、词以及字符的总数。Linux的各个命令实际上高度专业化,并尽量相互独立。每一个都只专注于一个小的功能。但通过pipe,我们可以将这些功能合在一起,实现一些复杂的目的。

21.指令(instruction)→进程(process)→程序(program)

22.创建进程
Linux kernel并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork是一个系统调用。

23.进程树
所有的进程也构成一个以init为根的树状结构。可以用pstree命令来查询进程树

24.信号(signal)机制
信号是一种向进程传递信息的方式。相对于其他的进程间通信方式(interprocess communication, 比如说pipe, shared memory)来说,信号所能传递的信息比较粗糙,只是一个整数。但正是由于传递的信息量少,信号也便于管理和使用。信号因此被经常地用于系统管理相关的任务,比如通知进程终结、中止或者恢复等等。
信号是由内核(kernel)管理的。信号可以是内核自身产生的,比如说出现硬件错误。内核中针对每一个进程都有一个表存储相关信息(相当于酒店房间的信箱)。

25.进程间通信方式(interprocess communication)
信号(signal),管道(pipe),共享内存(shared memory)

26.常见信号
SIGINT 中断(INTERRUPT)改程序
SIGQUIT 退出(QUIT)改程序
SIGTSTP 暂停(STOP)改程序
SIGCONT 继续
SIGALRM 定时

27.关于信号的学习
信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。

28.进程组(process group)、进程组领导进程(process group leader)、进程组ID(process group ID,PGID)
进程组领导进程的ID就是进程组ID

29.tty
tty表示控制终端

30.会话(session)
会话主要是针对一个终端建立的。当我们打开多个终端窗口时,实际上就创建了多个终端会话。每个会话都会有自己的前台工作和后台工作。这样,我们就为进程增加了管理和运行的层次。在没有图形化界面的时代,会话允许用户通过shell进行多层次的进程发起和管理。比如说,我可以通过shell发起多个后台工作,而此时标准输入输出并不被占据,我依然可以继续其它的工作。

31.UID&GID
Linux的用户在登录(login)之后,就带有一个用户身份(user ID,UID)和一个组身份(group ID,GID)。

32.context环境
位于栈最下面的帧(栈是以帧为单位的),和全局变量一起构成了当前的环境(context)

33.malloc & free (注意区分heap和stack)
当程序中使用malloc的时候,堆(heap)会向上增长,其增长的部分就成为malloc从内存中分配的空间。malloc开辟的空间会一直存在,直到我们用free系统调用来释放,或者进程结束。一个经典的错误是内存泄漏(memory leakage), 就是指我们没有释放不再使用的堆空间,导致堆不断增长,而内存可用空间不断减少。

34.栈溢出(stack overflow)
当栈和堆增长到两者相遇的时候,也就是空间中unused area完全消失的时候,没有可用内存,进程就会出现stack overflow,导致进程终止。stack overflow可以说是最出名的计算机错误了。stackoverflow.com

35.进程附加信息
包括PID,PPID,PGID等,用来说明进程的身份、进程关系以及其它统计信息。这些信息并不保存在进程的内存空间中。内核会为每个进程在内核自己的空间中分配一个变量(task_struct结构体)以保存上述信息。

36.fork & exec
fork调用的时候,就是将上面的内存空间,包括text,globle data,heap,stack又复制一个出来,构成一个新的进程,并在内核中为改进程将建新的附加信息。调用exec的时候,进程清空自身内存空间的text, global data, heap和stack,并根据新的程序文件重建text, global data, heap和stack (此时heap和stack大小都为0),并开始运行。

37.多线程
创建一个新的线程时,我们为这个线程建一个新的栈。每个栈对应一个线程。当某个栈执行到全部弹出时,对应线程完成任务,并收工。所以,多线程的进程在内存中有多个栈。

38.多线程同步(synchronization)
我们可以通过互斥锁(mutex),条件变量(condition variable)和读写锁(reader-writer lock)来同步资源。

39.条件变量
条件变量特别适用于多个线程等待某个条件的发生。如果不使用条件变量,那么每个线程就需要不断尝试获得互斥锁并检查条件是否发生,这样大大浪费了系统的资源。

40.读写锁
读写锁有三种状态: 共享读取锁(shared-read), 互斥写入锁(exclusive-write lock), 打开(unlock)。后两种状态与之前的互斥锁两种状态完全相同。

41.进程间通信
进程间通信主要分为管道(pipe)机制和传统的进程间通信机制。后者——传统的进程间通信——包括消息队列(message queue),信号量(semaphore),共享内存(shared memory)。

42.传统IPC非常类似于多线程共享资源的方式

43.互联网通信 & 进程间通信
互联网通信实际上也是一个进程间通信的问题,只不过这多个进程分布于不同的电脑上。网络连接是通过socket实现的。实际上,socket也可以用于计算机内部进程间的通信。

44.文件&文件的元数据(metadata)
我们知道,一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。这个元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。

-----------------------------------------Linux命令-------------------------------------------------------
命令名字+关键字(实际上关键字是一种特殊的参数,大部分情况下用来开关程序的某些特殊功能)+参数
关键字和参数可以不止一个
如果命令没有放在默认路径中,我们也可以输入绝对路径来执行。命令本质上是可执行文件。
1.ls命令(list)
ls [选项] [目录名]

2.pwd查看当前路径

3.mkdir创建一个目录

4.rm删除文件或者目录

5.sudo临时以root的身份操作 EX:sudo ls

6.查寻一个命令的功能which whereis whatis man info

7.文件操作ls 查询详细信息

8.cp 是copy的简写,用来复制文件

9.mv 是move的简写,用来移动文件,当然了在同一个目录下移动是可以重命名的

10.-r关键字 是recursive的缩写
-l 表示详细信息
-a 表示全部的

11.mkdir创建一个目录

12.rmdir删除一个空目录

13.chmod 改变文件权限。是change mode的缩写

14.chown 改变文件的拥有者,只有超级用户权限才能执行,前面加sudo

15.chgrp 改变文件的拥有组,只有超级用户权限才能执行

16.echo 将文本流倒像标准输出

17.cat 标准输出 ex: $cat < a.txt

18.可以使用>&来同时重新定向标准输出和标准错误.如果只想重新定向标准错误,可以使用2> 标准错误对应的总是2号,所以有以上写法。

19.wc 代表word count,用于统计文本中的行、词以及字符的总数。
ex: $ cat< a.txt|wc #输出29 254 1504

20.查看进程
$ps -eo pid,comm,cmd -e表示列出全部进程,-o pid,comm,cmd,ppid表示我们需要PID,COMMAND,CMD,父进程id信息

21.startx 进入图形界面——还没试过

22.man -k man 查找出只要有man这个关键字就将该说明列出来

23.whatis [指令或者是资料] <==相当于 man -f [指令或者是资料]
apropos [指令或者是资料] <==相当于 man -k [指令或者是资料]

24.info page 跟man的用途差不多,info page则是将文件资料拆成一个一个的段落,每个段落用自己的页面来撰写, 并且在各个页面中还有类似网页的‘超连结’来跳到各不同的页面中,每个独立的页面也被称为一个节点(node)。 可以将info page想成是文字模式的网页显示资料啦

25.nano text.txt nano是一个超简单的文本编辑器

26.鸟哥通常都只有记shutdown与reboot这两个指令啦!不过使用poweroff这个指令却比较简单就是了!

27.切换执行等级: init
只要记住下面四种等级:
run level 0:关机
run level 3:纯文字模式
run level 5:含有图形介面模式
run level 6:重新开机
所以用init 0 就可以关机

28. Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限。

29.档案的类型与权限的那一串字符第一个字元代表这个档案是“目录、档案或连结档等等”:
当为[ d ]则是目录,例如上表档名为‘.gconf’的那一行;
当为[ - ]则是档案,例如上表档名为‘install.log’那一行;
若是[ l ]则表示为连结档(link file);
若是[ b ]则表示为装置档里面的可供储存的周边设备(可随机存取装置);
若是[ c ]则表示为装置档里面的序列埠设备,例如键盘、滑鼠(一次性读取装置)。

Just like writing, coding is a work of creating!
原文地址:https://www.cnblogs.com/chenbuer/p/3843524.html