Linux知识点记录

----------------------------------------------一切关于Linux的知识点都记录在这里-------------------------------------------------------

在命令行中输入$man 2 syscalls可以查看所有的系统调用。可以通过$man 2 read来查看系统调用read()的说明。在这两个命令中的2都表示我们要在2类(系统调用类)中查询(具体各个类是什么可以通过$man man看到)。

>表示重新定向,|表示管道

Linux老鸟鼓励新手多用shell,少用图形化界面。一个shell对应一个终端(terminal)。

Linux利用内核实现软硬件的对话。通过系统调用这个接口,Linux将上层的应用与下层的内核分离,隐藏了底层的复杂性,也提高了上层应用的可移植性。

如何了解一个陌生的命令?

$which ls 在默认路径中搜索命令,返回该命令的绝对路径。

$whereis ls 在相对比较大的范围搜索命令,返回该命令的绝对路径。

$whatis ls 用很简短的一句话来介绍命令。

$man ls 查询简明的帮助手册。

$info ls 查询更详细的帮助信息。

文件操作相关:

$touch a.txt

$cp a.txt a.txt 在工作目录下,将a.txt复制到文件b.txt

$mv a.txt c.txt 将a.txt移动成为c.txt(相当于重命名rename)

$rm a.txt 删除a.txt

$rm -r /home/vamei 删除从/home/vamei向下的整个子文件系统。-r表示recursive,是指重复删除的操作,/home/vamei文件夹为空,然后删除/home/vamei文件夹本身。

$rm -rf /home/kevin/temp/  f的目的是告诉rm放心干,不用再确认了。

$mkdir /home/vamei/good 创建一个新的目录

$rmdir /home/vamei/good 删除一个空的目录

$chmod 755 a.txt

(你必须是文件a.txt的拥有者才能运行此命令。或者以$sudo chmod 755 a.txt的方式,以超级用户的身份运行该命令。)

change mode 改变a.txt的读、写以及执行权限。还记得每个文件都有九位的读写执行权限(参看 Linux文件管理背景知识),分为三组,分别对应拥有者(owner),拥有组(owner group)中的用户和所有其他用户(other)。在这里,我们也有三个数字,755,对应三个组。7被分配给拥有者,5被分配给拥有组,最后一个5分配给其它用户。Linux规定: 4为有读取的权利,2为有写入的权利,1为有执行的权利。我们看到的7实际上是4 + 2 + 1,表示拥有者有读、写、执行三项权利。(想想5 意味着什么)

这时,运行$ls -l a.txt, 你应该看到九位的权限变成了rwxr-xr-x。根据自己的需要,你可以用比如444, 744代替755,来让文件有不同的权限。

当Linux执行一个程序的时候,会自动打开三个流,标准输入,标准输出,标准错误。比如说你打开命令行的时候,默认情况下,命令行的标准输入连接到键盘,标准输出和标准错误都连接到屏幕。对于一个程序来说,尽管它总会打开者三个流,但它会根据需要使用,并不是一定要使用。

$ls > a.txt 重新定向

$ls >> a.txt 这里>>的作用也是重新定向标准输出。如果a.txt已经存在的话,ls产生的文本流会附加在a.txt的结尾,而不会像>那样每次都新建a.txt。

echo的作用是将文本流导向标准输出。

$echo hello > a.txt

我们将cat标准输入指向a.txt,文本会从文件流到cat,然后再输出到屏幕上。当然,我们还可以同时重新定向标准输出:$cat < a.txt > b.txt 这样,a.txt的内容就复制到了b.txt中。

我们还可以使用>&来同时重新定向标准输出和标准错误。假设我们并没有一个目录void。那么$cd void > a.txt会在屏幕上返回错误信息。因为此时标准错误依然指向屏幕。当我们使用:$cd void >& a.txt 错误信息被导向a.txt。

$cat eee &>> a.txt 附加到最后

如果只是想重新定向标准错误,可以使用2>:$cd void 2> a.txt > b.txt 标准错误对应的总是2号,所以有以上写法。标准错误输出到a.txt,标准输出输出到b.txt。

-------------------------------------------------------------------------------------

管道(pipe):理解了以上内容之后,管道的概念就易如反掌。管道可以将一个命令的输出导向另一个命令的输入,从而让两个(或者更多命令)像流水线一样连续工作,不断地处理文本流。在命令行中,我们用|表示管道:

$cat < a.txt | wc

wc命令代表word count,用于统计文本中的行,词以及字符总数。a.txt中的文本先流到cat,然后从cat的标准输出流到wc的标准输入,从而让wc知道自己要处理的是a.txt这个字符串。

$echo abcd | wc

Linux的各个命令实际上高度商业化,并尽量相互独立。对每一个都只专注于一个小的功能。但通过pipe,我们可以将这些功能合在一起,实现一些复杂的目的。

-------------------------------------------------------------------------------

如何创建一个新进程?

实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux kernel并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork是一个系统调用。进程存活于内存中。每个进程都在内存中分配有属于自己的一片空间 (address space)。当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。

老进程成为新进程的父进程(parent process),而相应的,新进程就是老的进程的子进程(child process)。一个进程除了有一个PID之外,还会有一个PPID(parent PID)来存储的父进程PID。如果我们循着PPID不断向上追溯的话,总会发现其源头是init进程。所以说,所有的进程也构成一个以init为根的树状结构。

还可以用$pstree命令来显示整个进程树。

进程与线程(Thread)

尽管在UNIX中,进程与线程是有联系但不同的两个东西,但在Linux中,线程只是一种特殊的进程。多线程之间可以共享内存空间和IO接口。所以,进程是Linux程序的唯一的实现方式。

Linux进程间通信

信号可以看作一种粗糙的进程间通信(IPC,interprocess communication)的方式,用以向进程封闭的内存空间传递信息。为了让进程间传递更多的信息量,我们需要其他的进程间通信方式。这些进程间通信方式可以分为两种:

管道机制。我们可以使用管道将一个进程的输出和另一个进程的输入连接起来,从而使用文件操作API来管理进程间通信。在shell中,我们经常利用管道将多个进程连接在一起,从而让各个进程协作,实现复杂的功能。

传统IPC。我们主要是指消息队列,信号量,共享内存。这些IPC的特点是允许多进程之间共享资源,这与多线程共享heap和global data相类似。由于多进程任务具有并发性,所以在共享资源的时候也必须解决同步的问题。




你可能感兴趣的:(Linux知识点记录)