目录结构
系统启动:
- /boot:存放启动Linux 时使用的内核文件,包括连接文件以及镜像文件
- /etc:存放所有的系统需要的配置文件和子目录列表,更改目录下的文件可能会导致系统不能启动
- /lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件 几乎所有的应用程序都需要用到这些共享库
- /sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中
指令集合:
- /bin:存放着最常用的程序和指令
- /sbin:只有系统管理员能使用的程序和指令
外部文件管理:
- /dev :Device(设备)的缩写, 存放的是Linux的外部设备。注意:在Linux中访问设备和访问文件的方式是相同的
- /media:类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下
- /mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了
临时文件:
- /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run
- /lost+found:一般情况下为空的,系统非法关机后,这里就存放一些文件
- /tmp:这个目录是用来存放一些临时文件的
账户:
- /root:系统管理员的用户主目录
- /home:用户的主目录,以用户的账号命名的
- /usr:用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录
- /usr/bin:系统用户使用的应用程序与指令
- /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序
- /usr/src:内核源代码默认的放置目录
运行过程:
- /var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)
- /proc:管理内存空间!虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改
扩展:
- /opt:默认是空的,我们安装额外软件可以放在这个里面
- /srv:存放服务启动后需要提取的数据(不用服务器就是空)
文件属性
文件类型及权限
左边第一部分的10个字符 表示文件的类型及执行权限
- 第一个字符:代表这个文件的类型
d
目录-
文件l
链接文档(link file)b
装置文件里面的可供储存的接口设备(可随机存取装置)c
装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
- 接下来的字符:以三个一组分成三组,用 r、w、x 三个参数的组合表示,位置不会改变
r
可读(read)w
可写(write)x
可执行(execute)-
没有权限
- 前3个字符:文件的所有者对文件的权限 owner
- 中间三个字符:所有者的同组用户对文件的权限 group
- 后三个字符:其他用户对文件的权限 others
权限的数字表示
Linux文件属性有两种设置方法,一种是符号,另一种是数字
Linux 文件的基本权限有九个 分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限
因为每种权限只有两种状态 有或者没有,所以权限就可以使用二进制表示
数字表示就是用三种权限的数字和 代表该组的权限,其中
- r = 4 (100)
- w = 2 (10)
- x = 1 (1)
- rwx = 7 (111)
特殊权限
除了rwx-外 有时候在执行权限的位置上 还会出现s或者t字符
s权限和t权限的说明:
- s:用户执行这个文件时将以文件 所有者/所属组 的身份执行
- S:同s,但原先文件没有x权限(显然不能执行)
- t:普通用户只能删除自己创建的文件/目录,而不能删除不属于自己的文件/目录
- T:同t,但原先文件没有x权限
与rwx相对,特殊权限也分为三种:
- SetUID(s权限,4)
- SetGID(s权限,2)
- SetBID也叫Sticky(t权限,1)
SetUID
占用 所有者的x权限位
设置 SetUID:
chmod u+s 文件名
#采用数字赋权时 在原先权限前加一个4
chmod 4777 文件名
取消 SetUID:
chmod u-s 文件名
#赋予原权限即可
chmod 777 文件名
SetGID
占用 用户组的x权限位
目录下创建的所有文件和子目录的所属组 都会继承该目录所属组的属性
设置 SetGID
chmod g+s 文件名
#采用数字赋权时 在原先权限前加一个2
chmod 2777 文件名
取消 SetGID
chmod g-s 文件名
#赋予原权限即可
chmod 777 文件名
Sticky
Stick Bit,粘滞位
占用 其他(others)的x权限位
设置 SBIT
chmod o+t 文件名
#采用数字赋权时 在原先权限前加一个1
chmod 1777 文件名
取消 SBIT
chmod o-t 文件名
#赋予原权限即可
chmod 777 文件名
特殊属性
让root用户 也不能做任何操作 的属性
使用 lschattr命令查看 chattr命令赋予(详见Linux常用命令)
文件存储
文件的存储 分为内容 和 元数据两部分
其中内容 放在数据块(block)中 元数据放在(inode)中(除了文件名)
inode的结构:
说明:
- iNumber是文件的唯一标识
- Linux中一切皆文件
- 文件的文件名 保存的目录的block中
- 目录block的内容:文件名,inode编号
链接
Linux链接分两种 一种被称为硬链接(Hard Link) 另一种被称为符号链接(软链接)(Symbolic Link)
默认情况下,ln命令产生硬链接
硬链接:
- 多个文件名指向同一个inode编号 即为硬链接
- 创建硬链接仅仅是在目录block中 新增一条数据:文件名,链接文件inode编号
- 特点:
- 不占用实际空间
- 只能对已存在的文件创建(不允许对目录)
- 只能在同一个文件系统中才能创建
- 删除原文件 不影响链接使用
- 换言之,删除文件指的是删除文件所有的硬链接
软链接:
- 文件数据块(block)中存放的内容是另一文件的路径名的指向 该文件即软链接
- 特点:
- 以路径的形式存在 类似于Windows操作系统中的快捷方式
- 可以跨文件系统
- 可以对一个不存在的文件进行链接
- 可以对目录进行链接
- 删除原文件 影响链接
注意:
- 无论什么链接,改动了一处,其它的文件都会发生相同的变化
- ln指令,同时指定多个文件或目录,如果最后的目的地是不是一个已经存在的目录,则会出现错误信息
- 否则会把前面指定的所有文件或目录复制到该目录中
挂载
将设备文件中的顶级目录连接到 Linux 根目录下的某一目录的过程称为 挂载
为什么需要挂载?
- Linux中一切皆文件,所有文件都放置树形目录结构中
- 任何硬件设备也都是文件,但问题是 它们有各自的一套文件系统(文件目录结构)
- 如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到
- 只有挂载后,硬件设备才能为我们所用,访问挂载目录就等同于访问设备文件
注意:
- 挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点
- 设备文件在/deb/目录下会显示 但它不是目录 不能ls
- 它是一个类似指针的东西,指向这个分区的原始数据块
- mount前,系统并不知道这个数据块哪部分数据代表文件,如何对它们操作
- 插入CD,系统自动执行了 mount /dev/cdrom /media/cdrom
- 所以可以直接在/media/cdrom中对CD中的内容进行管理。
信号
是由用户、系统或者进程发送给目标进程的信息,以通知目标进程 某个状态改变或系统异常
信号列表:
编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),也叫标准信号、阻塞信号
编号为34 ~ 64的信号是后来扩充的,称做可靠信号(实时信号)
标准信号的局限性:
- 信号可能会丢失 当一个信号阻塞时,这个信号即使多次发送给进程,也只被执行一次
- 信号交付没有携带与信号有关信息 接受到信号的进程无法区分同种信号的不同情况,也不知道信号从何而来
- 信号的交付没有优先级 当有多个信号悬挂与一个进程时,交付的顺序不确定
实时信号的特点:
- 实时信号和标准信号不一样,他没有明确的含义,而是由使用者自己来决定如何使用
- 进程可以接受多个同样的实时信号,而标准信号不能,在标准信号没有得到处理的时候,多个标准信号会被合为一个
- 实时信号使用sigqueue发送的时候,可以携带附加的数据(int或者pointer)
- 实时信号有时间顺序的概念,所以同样的实时信号会按次序被处理
- 信号实质上是软中断,中断有优先级,信号也有优先级。实时信号具有优先的概念,数值越低的信号其优先级越高,也就是数值低的实时信号优先得到处理。实时信号和标准信号的优先级,在posix中是未定义的,一般来说会优先处理标准信号
- 实时信号的默认行为都是结束当前的进程
标准信号的作用
- SIGHUP 信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件
- 登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载
- SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程
- SIGKILL 用来立即结束程序的运行 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号
- SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间 alarm函数使用该信号
- SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL
- SIGCHLD 子进程结束时, 父进程会收到这个信号
- 如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)
- SIGCONT 让一个停止(stopped)的进程继续执行 本信号不能被阻塞 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作 例如, 重新显示提示符
- SIGSTOP 停止(stopped)进程的执行 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行 本信号不能被阻塞, 处理或忽略
- SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
- SIGURG 有"紧急"数据或out-of-band数据到达socket时产生
程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP
SIGCONT信号 在进程挂起时是继续,否则是忽略,不能被阻塞
ctrl+c ctrl+d ctrl+z的区别
- Ctrl+c 发出SIGINT信号(2) 中断程序的执行
- Ctrl+z 发出SIGTSTP信号(20) 是将任务中止(暂停的意思)
- 此时任务并没有结束,仍然在进程中他只是维持挂起的状态
- 用户可以使用fg/bg操作继续前台或后台的任务
- fg命令重新启动前台被中断的任务
- bg命令把被中断的任务放在后台执行
- Ctrl+d 不是发送信号,而是表示一个特殊的二进制值EOF
- 在shell中,ctrl+d表示退出当前shell
- 退出shell 会发送SIGHUP信号(1)
捕捉信号
trap命令 可以在shell脚本运行时 根据接收的信号做相应处理
命令格式:
trap [参数] [执行的命令或函数] [信号]
参数说明:
- -l 打印编号1-64编号信号名称
- -p 打印与指定信号相关联的trap命令
发送信号
kill命令,详见Linux常用命令
管道
Linux 使用竖线
|
连接多个命令,这被称为管道符使管道符
|
左边命令的输出成为右边命令的输入
语法格式:
command1 | command2 [ | commandN ]
注意:
- command1 必须有正确输出,而 command2 必须可以处理 command1 的输出结果
- command2 只能处理 command1 的标准输出,不能处理 command1 的错误输出
其他符号:
- && 前面命令成功,则后一条之心
- || 前面命令失败,则后一条执行
编码转换
windows换行符转linux换行符
sed -i 's/\r//' filename
vim中设置编码
:edit ++enc=utf8
shell iconv命令
iconv --list 列出iconv支持的编码列表
命令格式:
iconv -f 原编码 -t 新编码 filename -o newfile
参数说明:
- -f 来源编码
- -t 转换后新编码
- -c 忽略无效字符
- -s 忽略警告
- -o file 保留源文件
运行jar包
- 直接运行主类:
java -jar xxx.jar
- 运行其他类:
java -classpath xxx.jar:yyy.jar xxx(类)
注意:如果包含同包同名的类,哪个在前面加载哪个
Comments NOTHING