赞
踩
自由软件是一种思想活动,强调用户该如何使用软件的自由。
可以自由的运行,自由的拷贝,自由的更改,自由的更改再发行。
这种指的自由,并不是价格免费,和价格无关,是使用软件对所有用户来说是自由的。
简单概括:Linux系统基于Unix系统诞生于1991年,由芬兰大学生林纳斯·托瓦兹(Linus Benedict Torvalds)和后来陆续加入的众多爱好者共同开发完成。
Linux的标志和吉祥物为一只名字叫作Tux的企鹅——Torvalds’Unix
linux的发展:
(1)1984年,Andrew S.Tanenbaum 开发了用于教学的Unix 系统,命名为MINIX.
(2)1989年,AndrewS.Tanenbaum 将MINIX 系统运行于X86 的PC 计算机平台。
(3)1990年,芬兰赫尔辛基大学学生Linus Torvalds 首次接触MINIX系统。
(4)1991年,LimusTorvalds 开始在MINIX上編写各种驱动程序等操作系统内核组件。
(5)1991年底,Limus Torvalds 公开了Linux 内核源码0.02 版
(6) 1993年,Linux 1.0版发行,Linux 转向GPL 版权协议。
(8) 1994 年,Linux 的第一个商业发行版Slackware 问世。
(9) 1996年,美国国家标准技术局的计算机系统实验室确认Linux 版本1.2.13 (由Open Linux 公司打包)符合POSIX 标准
(10)1999 年,Linux 的简体中文发行版问世。
(11) 2000 年后,Linux 系统日趋成熟,涌现木量基于Linux 服务器平台的应用,并广应用于基于ARM技术的嵌入式系统中。
一般不会让你具体去解释的。
显示系统当前的日期和时间
显示当前工作路径
用于切换当前工作路径
显示日历,可显示公元1~9999年中某年某月的日历。
显示当前已经登陆到系统的所有用户名,登录终端以及登陆时间
用于统计给定文件的行数,字数,字符数
-l 表示统计行数,-w 表示统计单词数,-c表示统计字符数
显示操作系统当前信息
清屏操作
注意细节:
不管是重启系统还是关闭系统,尽量要先运行sync命令,把内存的数据写入到磁盘中
可以把一个命令的输出信息作为另外一个命令的输入信息,
从而将两个或两个以上的命令连接在一起,实现复杂的功能。
管道功能通过管道线 “|” ,实现,管道线 “|” 前面命令的输出信息作为后面命令的输入信息。
/**用来显示文件列表,基本语法为:ls [选项] [目录或文件名]
-a : 显示所有文件,包括隐藏文件
-l : 以长格式显示目录下的内容列表
-i : 显示文件索引节点号
-r : 以文件名反序排列并输出目录内容列表
-t : 用文件和目录的更改时间进行排序
-m : 用"," 隔开每个文件和目录的名称
-R/r: 递归显示指定目录下的所有文件及子目录
*/
用来切换工作目录到指定目录,可以用相对路径或绝对路径表示指定目录
用来显示文件的内容,还可以利用输入/输出重定向功能建立小型文件或将两个文件连接起来。
用来分屏显示大文件,当显示满一屏后停下来,并且在屏幕的底部出现一个提示信息,
给出以显示文件的百分比。
用于显示文件的开头内容,默认显示前10行
用于显示文件的尾部内容,默认显示后10行。
/**
用来将一个或多个源文件或目录复制到指定的目标目录中。
-f : 强行复制文件或目录,不论文件或目录是否存在
-i : 覆盖已有文件之前询问一下客户
-l : 对源文件建立硬链接,而非复制文件
-s : 对源文件建立符号链接,而非复制文件
-R/r : 递归处理,将指定目录下的所有文件与子目录一并处理
*/
/**
将文件从一个目录移到另一个目录,或对文件或目录进行重命名。
-b : 当目标文件存在时,覆盖前,为其创建一个备份
-f : 直接覆盖现有的文件或者目录
-i : 覆盖前询问顾客,看是否进行覆盖
*/
/**
删除一个目录中的一个或多个文件或者目录,也可以将某个目录及其下的所有文件和子目录均删除
-f : 强制删除文件或者目录
-i : 删除前会询问用户是否确认进行删除
-R/r : 将指定目录下的所有文件与子目录一并处理
*/
创建新的空文件或者改变已有文件的时间标签(已有文件的数据不变)
识别文件类型,也可以用来辨别一些文件的编码格式。
/**
在文件系统中查找指定的文件,可以根据文件的名称,大小,建立时间等信息查找文件。
-name : 指定文件名字符串作为寻找文件的匹配标准,可以使用通配符
-type : 查找符合指定的文件类型的文件
-perm : 查找符合指定的权限值的文件或目录
-links: 查找符合指定的硬链接数目的文件或者目录
-size : 查找符合指定的文件大小的文件
......
*/
所有的linux系统都会内建vi文本编辑器
vim具有程序编辑的能力,可以看做是vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
代码补全、编译及错误跳转等方便编程的功能特别丰富
以vi或者vim打开一个文档就直接进入一般模式了。(默认的模式)
在正常模式下可以使用快捷键
在正常模式下按下i字母后,会进入到编辑模式
该模式下,程序员可以输入内容
在这个模式当中,可以提供你相关指令,完成读取,存盘,替换,离开vi/vim,显示行号的动作
拷贝当前行 yy
拷贝当前行向下的5行 5yy,并粘贴(粘贴的命令是 p)
删除当前行 dd
删除当前行向下的5行 5dd
命令行下 /关键字,回车后就会查找,再输入n就是依次往下查找
set nu是设置行号,set nonu是取消行号
输入 G 会到达文档的最末行
输入 gg 会到达文档的首行
在正常模式下输入 u 就会撤销上次的动作
磁盘主要是由磁盘盘片,传动手臂,磁头与主轴电动机以及传动轴所组成。
一个磁盘可以有一个或多个盘片,每个盘片上下都会有一个磁头用来读/写数据。
硬盘分区包括主分区,扩展分区和逻辑分区
1.linux 的目录中有且仅有一个根目录/
2.linux 的各个目录存放的内容是规划好的,不要乱放文件
3.linux 是以文件的形式管理我们的设备,因此linux系统,一切皆为文件
4.linux 的各个文件目录下存放什么内容,大家必须有一个认识。
索引节点。每个存储设备或存储设备的分区被格式化为文件系统后有两部分,一部分是block;另外一部分是inode。
文件存储在硬盘上,最小存储单位是"扇区"(Sector),每个扇区能存储512B。操作系统在读取硬盘的时候,不会一个分区一个分区的读取,这样的效率太低,而是一次性连续读多个扇区,及一次性读一个块(Block)。这种块是存取的最小单位,块的大小最常见的是4KB.所以Block是用来存储数据用的。inode就是用来存储这些数据的信息,这些信息包括文件大小,属主,归属的用户组、读/写权限等。
inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快找到对应的文件。
inode包含文件的元信息,具体有以下内容:文件的字节数、文件拥有者的User ID、文件的Group ID、文件的读写权限、文件的时间戳、链接数、文件数据Block的位置。
创建和维护分区表的程序,兼容了DOS类型的分区表、BSD或者SUN类型的磁盘列表。
fdisk用来创建分区,删除分区,查看分区信息等基本操作。
当硬盘分区完成后就要进行对文件系统的格式化。mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。
在Linux操作系统中,需要将某些设备或者是已经建立好的文件系统安装到Linux文件目录树的某个位置上,这个过程叫做挂载,文件系统所挂载的目录就是挂载点
我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。
文件描述符
文件描述符 | 宏 | 说明 |
---|---|---|
0 | STDIN_FILENO | 标准输入 |
1 | STDOUT_FILENO | 标准输出 |
2 | STDERR_FILENO | 标准错误输出 |
功能:用于打开或创建文件,在打开文件或创建文件时可以指定文件的属性以及用户的权限等参数
返回值:成功的话返回文件描述符;出错的话返回-1
open函数建立了一条到文件或设备的访问路径。
#include<fcnt1.h>
int open(const char *path,int flags,mode t_mode);
/**
flags 用于描述文件打开方式,常数定义在头文件中
*/
功能:用于创建一个文件。
返回值:若成功返回以只写方式打开的文件描述符;若出错,则为-1.
# include<unistd.h>
int creat(const char *path,modet t_mode);
功能:用于关闭一个被打开的文件
返回值:若成功返回0;出错返回-1.
# include<unistd.h>
//fd是需要关闭文件的文件描述符
int close(int fd);
当一个进程终止时,它所有的打开文件都由内核自动关闭。
功能:用于修改文件名称
返回值:若成功返回0;若出错返回-1.
#include<stdio.h>
//参数oldpath是文件的原路径;newpath是文件的新路径
int rename(const char *oldpath,const char *newpath);
功能:删除文件
返回值:若成功返回0;出错返回-1
#include<stdio.h>
//参数pathname是文件的路径
int remove(const char*pathname);
功能:修改文件的访问权限
返回值:成功返回0;出错返回-1
#include<sys/types.h>
#include<sys/stat.h>
int chmod(const char *path,mod_t mod);
功能:修改文件所有者
返回值:成功返回0;出错返回-1
#include<sys/types.h>
#include<sys/stat.h>
//参数path是文件的路径;owner是指定文件的所有者;group是指定文件的组
int chown(const char *path,uid_t owner,gid_t group);
功能:用于在指定的文件描述符中将文件指针定位到相应的位置
#include<unistd.h>
off_t lessk(int file_des,off_t offset,int whence);
成功时返回新的文件偏移量,失败时返回-1.利用返回值可以测试文件描述符是否能够设置读写偏移量。当读写偏移量大于文件长度时,写操作将会在文件中构成一个空洞,空洞读为0,但是空洞并不占用磁盘空间,其处理方式与文件系统的实现有关。
功能:向文件写入数据
返回值:成功返回自己写的字节数;出错返回-1.
#include<unistd.h>
/**
file_des:文件描述符,标识要读取的文件。为0,从标准输入中读取数据
*buf:缓冲区,用来存储读入的数据
nbytes:要读取的字符数
*/
ssize_t write(int file_des,const void *buf,size_t nbytes);
功能:从文件中读取数据
返回值:成功返回读取到的字节数,若已回到文件结尾返回0;出错返回-1.
#include<unistd.h>
/**
file_des:文件描述符,标识要写入的文件。为1,就向标准输出写数据;为2,向标准错误写数据
*buf:待写入的文件,是一个字符串指针
nbytes:要写入的字符数
*/
ssize_t write(int file_des, void *buf,size_t nbytes);
都用于复制一个现有的文件描述符,成功返回新的文件描述符,出错返回-1。区别主要有两点
- dup一定返回当前可用的最小文件描述符;
- dup2指定参数file_des2为新的文件描述符,当file_des2打开时,先将其关闭,当file_des和file_des2相等时,返回file_des2而不关闭它。
dup
#include<unistd.h>
int dup(int file_des);
dup允许用户复制一个file_des文件描述符。存入一个已经存在的文件描述符,它就会返回一个与该描述符相同的新的文件描述符
dup2
#include<unistd.h>
int dup2(int file_des,int file_des2);
dup2函数如果调用成功,file_des2将变成file_des的复制品,两个文件描述符都指向同一个文件,并且file_des指向的文件,返回的是新的文件描述符,出错都返回-1.
进程可以理解为程序执行的实例,它包括可执行程序以及其他相关的系统资源,如打开的文件,挂起的信号,内核内部数据,处理器状态,内存地址空间以及包含全局变量的数据段等。
在Linux操作系统中,进程是操作系统调度的基本单位,创建进程的目的就是可以使多个程序并发的执行,从而提高系统的资源利用率和吞吐量
从狭义上来说,进程是指正在运行的程序的实例;从广义上来说,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
这类进程运行在内核模式下,执行一些内核指令(Ring 0).
工作在用户模式下,执行用户指令(Ring 3).
由shell终端启动的进程,它既可以在前台运行,也可以在后台运行。运行中需要与用户进行交互操作
是一个进程集合,负责按照顺序启动其他的进程。
一种开机后一直运行的进程。
他是实现特定功能或者执行系统相关任务的后台进程。
守护进程的父进程都是init进程;守护进程没有控制终端。
一个父进程退出后,它的一个或多个子进程还在运行,那么这些子进程都被称为孤儿进程。
孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。
一个子进程结束但是没有完全释放内存,该进程称为僵尸进程。
僵尸进程的父进程结束后该僵尸进程就会被init进程所收养,最终会被回收。
僵尸进程会导致资源的浪费,而孤儿进程不会。
进程的退出状态必须被维持下去,因为他要关心他的进程(父进程),父进程如果一直不读取,那子进程一直处于Z状态
维护退出状态本身就是要用数据维护,也属于进程的基本信息,所以保存在task_struct中,换句话说,Z状态一直不退出,PCB就要一直维护
父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费,因为数据结构对象本身就要占用内存。
内存泄露
通过signa(SIGCHLD, SIG_1GN)通知内核对子进程的结束不关心,由内核回改。如果不想让父进程挂起,可以在父进程中加入一条语句t: sig a(SICCHLD,SIG IGN)表示父进程忽略SIGCHLD信号,该信号是子进程退出的时候向父进程发送的。
父进程调用iwait/waitpid等函数等待子进程结束,如果尚无子进程退出wait会导致父进程阻塞。waitpid可以通过传递WNOHANG使父进程不阻塞立即返回。
如果父进程很忙可以用signal注册信号处理函数,在信号处理函数调用wait/waitpid等待子进程退出。
通过两次调用fork。父进程首先调用fork创建一个子进程然后waitpid等待子进程退出,子进程再fork一个孙进程后退出。这样子进程退出后会被父进程等待回收,而对于孙子进棋其巧进程已经退出所以孙进程成为一个孤儿进程,孤儿进程由init进程接管,孙进程结束后,init会等待回收。
第一种方法忽略SICHLD信号,这常用于并发服务器的性能的一个技巧因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设为忽略,可让内核把僵尸子进程转交给init进程去处理,省去了大量僵尸进程占用系统资源。
由任何一个用户创建一个子进程,创建成功后,子进程存在于系统之中,并且独立于父进程。
#include<unistd.h>
pid_t fork(void);
也是创建一个子进程,但是与fork也有些许的不同
对fork函数来说,父子进程的执行次序不确定,而且子进程复制父进程的处理数据段。
对vfork来说,vfork函数会保证子进程先运行,在它调用exec函数或者exit函数之后父进程才能被调度运行,子进程在调用exec函数或者exit函数之前与父进程数据是共享的。
#include<sys/types.h>
#include<unistd.h>
pid_t vfork(void);
调用成功时,子进程返回0,父进程返回子进程ID
会调用fork函数产生的子进程,由子进程调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的过程。
#include<stdlib.h>
int system(const *command);
system函数在调用/bin/sh时失败返回127,其他失败原因返回-1.若参数string为null,则返回非零值。
如果system函数在调用成功则最后返回执行shell命令后的返回值,但是此返回值也可能是调用/bin/sh失败后返回的127,因此最好检查errno来确认是否成功。
可以取代调用进程的内容,子进程可以调用execve函数执行另外一个程序。当调用execve函数时,进程执行的程序完全被替换成新程序,但是其进程ID并不会变,只是用新程序替换了当前进程的正文,数据,堆和栈。
#include<unistd.h>
int execve(const chat* filename,const char* argv[],const char * envp[]);
函数的第一个参数filename是可执行文件名称;
第二个参数argv是需要传递给可执行程序的参数;
第三个参数是环境变量数组。
调用成功则加载新的程序从启动代码开始执行,不在返回;如果出错则返回-1.
获取当前进程的进程号,返回值就是当前进程的进程号
#include<unistd.h>
pid_t getpid(void);
获取当前进程父进程的进程号,返回值就是当前进程父进程的进程号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。