Linux下C++编程(一)

2017/07/27 Linux基础学习

Posted by WangXiaoDong on July 27, 2017

时间:2017年7月27日 天气:晴


Author:冬之晓:angry:
Email: 347916416@qq.com

Linux基础学习

清屏

ctrl+L快捷键或者clear命令

命令历史(↑↓/history)

通过上下箭头调用历史命令 通过history命令显示历史的命令,和命令数组然后使用 !num可以从新调用对应num序号的命令

命令格式

命令 [选项]… [参数]…

命令Tab 补全

Tab 补全是非常有用的一个功能,可以用来自动补全命令或文件名,省时准确。

  • 未输入状态下连按两次 Tab 列出所有可用命令。
  • 已输入部分命令名或文件名,按 Tab 进行自动补全。

查看命令使用方法(man)

man 需要查看的命令

进程状态命令(ps)

ps命令,即process status的缩写

不加参数执行ps命令

这是一个基本的 ps 使用。在控制台中执行这个命令并查看结果。 结果默认会显示4列信息。

  • PID: 运行着的命令(CMD)的进程编号
  • TTY: 命令所运行的位置(终端)
  • TIME: 运行着的该命令所占用的CPU处理时间
  • CMD: 该进程所运行的命令

显示详细结果

如果使用- l参数。可以显示进程的详细状态

  • S:当前进程状态:
    • S:睡眠状态(自己的时间片没到)
    • T:挂起状态(进程停止了,什么也不做,注意跟睡眠状态的区别,本身没有分配时间片)
    • R:运行状态(自己的时间片到了)
    • Z:僵尸状态(程序结束,但是没有回收其资源)
  • PPID:父进程的进程编号

显示所有当前进程

使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。 ps -ax 这个命令的结果或许会很长。为了便于查看,可以结合less命令和管道来使用。 ps -ax | less

注意:管道就是指:把左边命令的输出当成文件交个右边的命令来处理

根据用户过滤进程

在需要查看特定用户进程的情况下,我们可以使用 -u 参数。 比如我们要查看用户’dongzhixiao’的进程,可以通过下面的命令: ps -u dongzhixiao

通过cpu和内存使用来过滤进程

也许你希望把结果按照 CPU 或者内存用量来筛选,这样你就找到哪个进程占用了你的资源。 要做到这一点,我们可以使用 aux 参数,来显示全面的信息: ps -aux | less 当结果很长时,我们可以使用管道和less命令来筛选。 默认的结果集是未排好序的。可以通过 –sort命令来排序。 根据 CPU 使用来升序排序 ps -aux --sort -pcpu | less 根据 内存使用 来升序排序 ps -aux --sort -pmem | less 我们也可以将它们合并到一个命令,并通过管道显示前10个结果: ps -aux --sort -pcpu,+pmem | head -n 10

通过进程名和PID过滤

使用 -C 参数,后面跟你要找的进程的名字。 比如想显示一个名为getty的进程的信息,就可以使用下面的命令: ps -C getty 如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表: ps -f -C getty

根据线程来过滤进程

如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID。 ps -L 1213

查看特定PID的状态

使用-p 进程ID可以查看对应ID的进程状态

树形显示进程

有时候我们希望以树形结构显示进程,可以使用 -axjf 参数。 ps -axjf 或者可以使用另一个命令。 pstree

使用PS实时监控进程状态

ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。 当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令和watch命令结合起来。 watch -n 1 'ps -aux --sort -pmem, -pcpu'

查看”当前工作目录“的完整路径

pwd命令

/etc/passwd文件

中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下: 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

  • “用户名”是代表用户账号的字符串。通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。
  • “口令”一些系统中,存放着加密后的用户口令字。虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。
  • “用户标识号”是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。 通常用户标识号的取值范围是0~65535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。
  • “组标识号”字段记录的是用户所属的用户组。它对应着/etc/group文件中的一条记录。
  • “注释性描述”字段记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。
  • “主目录”,也就是用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。 用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(BourneShell),csh(CShell),ksh(KornShell),tcsh(TENEX/TOPS-20typeCShell),bash(BourneAgainShell)等。系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。 用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

系统中有一类用户称为伪用户(psuedousers),这些用户在Linux /etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如下所示。 伪用户含义 bin拥有可执行的用户命令文件 sys拥有系统文件 adm拥有帐户文件 uucpUUCP使用 lplp或lpd子系统使用 nobodyNFS使用 拥有帐户文件 除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit,cron,mail,usenet等,它们也都各自为相关的进程和文件所需要。 由于Linux /etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解, 因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。 只有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

列出文件和目录(ls)

不带任何选项列出文件

不带选项的ls命令来光秃秃地列出文件和目录,我们是不能看到像文件类型、大小、修改日期和时间、权限以及链接这样具体的信息的。 ls

以尾部以标记字符结尾的方式列出文件和目录

使用 ls 命令的 -F 选项,会在每个目录的末尾添加标记字符显示。 ls -F

F就是flag缩写,代表打标记,出现的文件名后面如果是: *,代表可执行文件 @,代表是软连接,即快捷方式 /,代表目录 |,代表管道

带 –l 选项列出文件列表

ls -l(-l是字母不是“1”)就能展示出是文件还是目录,它的大小、修改日期和时间、文件或目录的名字以及文件的属主和它的权限。

显示的内容是:文件属性 文件数(文件的硬连接数) 拥有者 所属的group 文件大小 建档日期 文件名 ‘文件属性’开头第一个字母有不同的意思:

  • 开头’l’代表link是软连接
  • 开头’d’代表directory是目录
  • 开头’-‘代表是普通文件

‘文件属性’后面9个字母有不同的意思

  • 字母’r’代表read可读的
  • 字母’w’代表write可写的
  • 字母’x’代表execute可执行的

这9个字母以三个为一组分别代表文件拥有者的权限、同群组的权限、其他非本群组的权限 如果要修改权限,请参考修改权限命令(chmod)

创建软连接可以使用 ln -s 被建立的连接路径 软连接名字 创建硬连接可以使用 ln 被建立的连接路径 硬连接名字 硬连接必须在同一个物理设备上创建 删除实际上是减少一个硬连接的数量,只要硬连接数目不为0,该文件就不会被删除

浏览隐藏文件

列出所有文件包括以‘.’开头的隐藏文件。 ls -a

区别 ls -A,列出的不包括’.’和’..’代表当前文件目录和上级文件目录

用 -lh 选项来以易读方式列出文件

用-lh组合选项,以易读方式来显示大小。 ls -lh

倒序列出文件

ls -r 选项能以倒序方式显示文件和目录。 ls -r

r就是reserse—-反转的缩写

递归列出子目录

ls -R 选项能列出非常长的目录树 ls -R

以修改时间倒序列出

带-ltr组合选项能以文件或目录的最新修改时间的次序来显示它们。 ls -ltr

按文件大小排序

带-lS组合选项能按文件从大到小的次序显示。 ls -lS

列出目录信息

用ls -l命令列出/tmp目录下的文件,其中-ld参数可以只显示/tmp目录的信息。 ls -l /tmp ls -ld /tmp/

显示文件的UID和GID

用ls -n命令来显示文件和目录的UID(userid,用户ID)和GID(groupid,组ID)。 ls -n

复制命令(cp)

用来将一个或多个源文件或者目录复制到指定的目的文件或目录。 它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。 cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。

  • cp source dest意思是将 source 复制到 dest
  • cp folder/* dest意思是将 folder 下所有文件(不含子文件夹中的文件)复制到 dest
  • cp -r folder dest意思是将 folder 下所有文件(包含子文件夹中的所有文件)复制到 dest

移动(改名)命令(mv)

  • 可以移动多个文件: mv src1 src2… des—-将文件src1 src2…移动到des目录下

  • 也可以只移动一个文件,这是可以同时改名 mv src des/newName—-将文件src1移动到des目录下并改名为newName

  • 也可以该文件名 mv A B—-将目录(文件)A重命名为B

删除命令(rm,rmdir)

rm

对应参数: -d –directory 删除可能仍有数据的目录 (只限超级用户) -f –force 略过不存在的文件,不显示任何信息 -i –interactive 进行任何删除操作前必须先确认 -r/R –recursive 同时删除该目录下的所有目录层 -v –verbose 详细显示进行的步骤 –help 显示此帮助信息并离开 –version 显示版本信息并离开

rmdir

rmdir [-p] dirName 参数: -p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。

举例说明: rmdir folder1 删除名字为folder1的子目录。

rmdir -p folder1/folder2 删除名字为folder1里面的folder2这个子目录,如果删除folder2这个子目录后,folder1也成了空目录的话,那么folder1也会一同被删除。

注意:文件移动复制删除都可以使用通配符进行搭配 *—-匹配任意多个字符 ?—-匹配任意一个字符 [一个范围]—-匹配范围内一个字符 小心:[4-16]不是代表匹配4~16,而是代表匹配1~4和6,而1~4不和逻辑,因此只匹配6!

修改文件权限命令标签

修改文件权限命令(chmod)

chmod 永远更改一个文件的权限, 主要有 读取(r–4) 、写入(w–2)、执行(x–1),三种权限。 其中 所有者(u)、用户组(g)、其他(o) 各占三个,因此 ls -l 可以看到如下的信息

chmod +x filename 代表为 user ,group ,others 添加执行权限 chmod -x filename 代表取消 user , group ,others 的执行权限 chmod +w filename 代表为 user 添加写入权限 chmod ugo=rwx filename 代表设置 user ,group ,others 具有 读取、写入、执行权限 chmod ug=rw filename 代表设置 user ,group 添加 读取、写入权限 chmod ugo=--- filename 代表取消所有权限

也可以数字化修改 通过权限数字相加代表对应的权限控制, 比如可读(r–4)可写(w–2)可执行(x–1)代表4+2+1=7 可读(r–4)可执行(x–1)代表4+1=5 即: chmod 755 filename 代表为 user可读(r–4)可写(w–2)可执行(x–1) 且 group ,others 可读(r–4)可执行(x–1)

创建文件命令(touch)

创建一个文件 使用命令touch [options] file-list 其中选项[options]可以是:

-a 只更新访问时间,不改变修改时间

-c 不创建不存在的文件

-m 只更新修改时间,不改变访问时间

-r file  使用文件file的时间更新文件的时间

-t 将时间修改为参数指定的日期,如:07081556代表7月8号15点56分

从定向标记(> »)

把左边命令产生的输出写到右边文件中去

  • >是定向输出到文件,如果文件不存在,就创建文件; 如果文件存在,就将其清空; 一般我们备份清理日志文件的时候,就是这种方法:先备份日志, 再用>,将日志文件清空(文件大小变成0字节)。

  • >>这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件; 如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。

文件dev/tty

控制台终端(/dev/ttyn, /dev/console)在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。 它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。 当你在控制台上登录时,使用的是tty1。 使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等 称为虚拟终端, 而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。 因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。 /dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。 目前只有在单用户模式下,才允许用户登录控制台。

tty: 如果一个进程有控制终端的话,/dev/tty 就是它的控制终端,这个东西不是固定的,不同的程序打开这个 设备文件可能指向的终端不同。 #echo “test” > /dev/tty test tty0: tty1 –tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到 该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。 #echo “test” > /dev/tty0

/dev/tty主要是针对进程来说的,而/dev/tty0是针对整个系统来说的 就是说同是/dev/tty文件,对不同的进程来说,其具体指向是不同的。 但不管对那个进程来说/dev/tty0指向的都是当前的虚拟终端。

文件dev/null

把/dev/null看作”黑洞”。 它非常等价于一个只写文件, 所有写入它的内容都会永远丢失。 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用。

禁止标准输出.

cat $filename >/dev/null # 文件内容丢失,而不会输出到标准输出。

禁止标准错误

rm $badname 2>/dev/null # 这样错误信息[标准错误]就被丢到太平洋去了。

禁止标准输出和标准错误的输出.

`cat $filename 2>/dev/null >/dev/null 如果”$filename”不存在,将不会有任何错误信息提示。如果”$filename”存在, 文件的内容不会打印到标准输出. 因此Therefore, 上面的代码根本不会输出任何信息. 当只想测试命令的退出码而不想有任何输出时非常有用。

清除日志文件内容

cat /dev/null > /var/log/messages

/var/log/messages 有同样的效果, 但不会产生新的进程.(因为:是内建的)

查看一个文件(cat/more/less)

都是打开查看一个文件,区别

  • cat直接打开,显示到文件尾部
  • more显示文件开头,可以向下翻页,但是无法往回翻页
  • less显示文件开头,可以向下翻页,也可以往回翻页

看一个文件的头/尾几行(head/tail)

可以看一个文件的头/尾几行的命令

  • head -num file—-看file文件前num行的数据
  • tail -num file—-看file文件后num行的数据

统计一个文件(wc)

word count的缩写,统计一个文件的行数、单词数、字节数 默认都统计,带参数值统计参数的那个内容,参数如下

-l—-行数 -w—-单词数 -c—-字符串

查找包含指定字符的行(grep)

grep 主要用于返回匹配的项目,支持正则表达式。

grep PATTERN filename—-返回所有含有 PATTERN 的行

-i—-代表ignore,即忽略大小写 -v—-代表查看不包含字符的行 -n—-代表显示匹配行及 行号

pattern正则表达式主要参数: -—忽略正则表达式中特殊字符的原有含义 ^—-匹配正则表达式的开始行 $—-匹配正则表达式的结束行 <—-从匹配正则表达 式的行开始 >—-到匹配正则表达式的行结束 [ ]—-单个字符,如[A]即A符合要求 [ - ]—-范围,如[A-Z],即A、B、C一直到Z都符合要求 .—-所有的单个字符 *—-有字符,长度可以为0