Linux
第一章、Linux常用指令
帮助命令:
man,help,info
文件系统命令
Linux文件类型:
- 普通文件
- 目录文件
- 符号链接文件
- 设备文件
- 管道文件
- Socket文件
文件系统目录结构
分层树形结构
主目录(/home/用户名)和当前目录(任意时刻,当前用户所在的目录)
一些指令:文件系统命令
ls pwd cd mkdir rmdir mv rm wc find grep gzip gunzip tar
文件存取权限
三种权限:
+ 读read(r)
+ 写write(w)
+ 执行execute(x)。
文件用户分为三种类型
+ 文件的所有者(user)
+ 群组(group)
+ 其他人(others)
用三个位来表示该类用户的文件存取权限,因此每一类的文件用户可以有8种可能的操作权限。
改变文件或目录的存取权限命令chmod
更改文件或目录的所有者命令chomd
挂载:
mount,umount:分别用于挂载、卸载指定的文件系统。
系统管理常用命令
ps kill command command& fg bg 输入重定向(<) 输出重定向(>) 管道命令(|) passwd date whoami hostname uname useradd
网络操作常用命令
ifconfig ifup ifdown ping netstat arp telnet ftp
网络安全常用命令
su chmod chown ps who top free kill &
字符串显示命令
echo
Shell的环境变量
- 更改shell环境变量的值我们在初始化文件/etc/profile 和/etc/csh.cshrc中更改
- shell元字符
字符?是一个匹配任何单个字符的通配符。
字符*则匹配0个或者多个字符。
符号[]表示区间中的任一字符。
命令行的执行方式
- 命令的顺序执行
- 命令的并发执行
- 命令行中&&操作
- 命令行中||操作
安装软件
- 使用rmp命令 rpm命令格式:rpm [参数] 软件包
- 在应用商店安装软件
第二章、Shell编程
shell程序的位置参数
- 位置参数,内部参数(&0,&1-&9,&*,&@,&#,&?,&&)
位置参数的设置
set [option] argument_list
用argument_list中的值来设置位置参数、标志、选项和位置参数设置环境变量和用户自定义变量
- 变量的声明和赋值
Bash中可以不声明变量,也可以使用declare和typeset来申明。
赋值:格式:variable=value
注意等于号"="前后没有空格,如果一个值包含空格,则必须包含在引号中,等于号对整形变量只能给整形值,不能给非整形值。 变量引用:shell中在变量名前面加一个$字符来访问它的内容
变量引用和引号使用:一般情况下,脚本文件中的参数异空白字符分隔(如空格、制表符或换行符),如果一个参数中包含空白字符,就必须加上引号。使用双引号可引用除"$"、"'"和"\"外的任意字符或字符串。单引号将值括起来不允许变量替换。反斜杠()可以用来去除某些字符的特殊意义
- 命令替换:$(command),将command结果输出
- 输入变量 read [option] variable-list
控制结构语句
- 顺序结构语句
- if语句
- for语句
- while语句
- until语句
- case语句
- 其他语句:
例如:break和continue语句 exit语句
数值处理
Linux的bash变量的值是以字符串格式存放的,要进行算法逻辑运算就必须转换为整数。
+ let命令
+ $((expression))扩展
+ expr命令
数组
- 声明数组
Array[key]=value array=(value1 value2 value3 …) array=([1]=one [2]=two [3]=three …) - 数组的访问
array[key]: a r r a y [ k e y ] : {array[1]} - 数组的删除
unset array[1]
unset array - 计算数组的长度
{#array} {#array} {#array[0]} {#array[\*]} {#array[\*]} {#array[@]} - 数组的提取
${array[@]:n:m] 提取数组n与m之间的元素 - 函数
格式
函数格式如下:
函数名( )
{
函数体
}
- 调用:
函数名 参数列表
第三章、Linux系统C开发工具
gcc编译器
- 支持的后缀名:.c .C .cc .cxx .m .i .ii .s .S .h .o .a/.so
- gcc指令格式:gcc [options] filename-list
- 常用选项有:
-ansi -c -g -l
-m -o -O -pg
-S -v -w -W
- gcc编译流程:
源代码-》预处理(-E .i)-》编译(-S .s)-》汇编(-c .o)-》链接(-o )-》可执行文件
编译c语言程序
- gcc编译器的主要参数
-c 生成目标文件(.o)
-S 生成汇编文件(.s)
-E 预编译
-g 在执行代码中包含调试信息
-o file 把文件输出到file中
-v 显示gcc版本信息
-I dir 在头部文件的搜索路径中添加dir目录
-L dir 在库文件的搜索路径中添加dir
-static 链接静态库
-llibrary 连接名为library的库文件
- 优化参数:
gcc提供的代码优化功能非常强大,它通过编译参数"-On"来控制优化代码的生成,其中n是一个代表优化级别的整数。 - 函数库
函数库是一组预先编译好的函数的集合,标准系统库文件一般存放在Linux文件系统/lib和/usr/lib目录中。库文件的名字以lib开头 - 静态库
程序需要使用函数库的某个函数的时候,必须包含一个声明该函数的头部文件。使用gcc –c 自己的程序进行编译后再使用ar建档就可以创建自己的静态库。 - 动态库
make工程文件
- make命令
make命令格式: make [选项] [make工程文件]
常用选项:
-d -f -n -s
- make规则
make默认的文件名是GNUmakefile,makefile和Makefile,也可以在命令行中指定别的文件名,多少程序员都选用Makefile。 - Makefile中的变量
Makefile中的变量就像环境变量。只要一行开始写变量名后面跟一个等于号"="以及要设置这个变量的值,就定义了变量,如: VARNAME=string
把变量用花括号括起来前面加个 就可以引用变量的值: 就 可 以 引 用 变 量 的 值 : {VARNAME} - make工作执行步骤:
1. 读入所有的makefile文件。
2. 读入被include包括的其他makefile文件。
3. 初始化文件中的变量。
4. 推导隐式规则,并分析所有规则。
5. 为所有的目标文件创建依赖关系链。
6. 根据依赖关系,决定哪些目标要重新生成。
7. 执行生成命令。
- gdb调试
第四章、Linux环境下的系统函数的使用
一)、数学函数的使用
sqrt rand srand等等
二)、字符函数的使用
isalnum isalpha isascii等等
三)、系统时间与日期函数的使用
1)、普通函数
Asctime Ctime Gettimeofday Gmtime Localtime等等
2)、结构体tm
struct tm
{
int tm_sec ; /*代表目前秒数,正常范围为0-59,但允许至61秒*/
int tm_min ; /* 代表目前分数,范围0-59 */
int tm_hour ; /* 从午夜算起的时数,范围为0-23 */
int tm_mday ; /* 目前月份的日数,范围01-31 */
int tm_mon ; /* 代表目前月份,从一月算起,范围从0-11 */
int tm_year ; /* 从1900 年算起至今的年数*/
int tm_wday ; /* 一星期的日数,从星期一算起,范围为0-6 */
int tm_yday ; /* 从今年1月1日算起至今的天数,范围为0-365 */
int tm_isdst ; /* 日光节约时间的旗标*/
};
3)、结构体timeval
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
4)、结构体timezone
struct timezone
{
int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/
int tz_dsttime; /*日光节约时间的状态*/
};
四)、环境控制函数
getenv putenv/setenv
五)、内存分配函数
calloc malloc getpagesize mmap mummap
六)、数据结构中常用函数
Bsearch lfind lsearch qsort
- 第五章、 文件IO操作
一)、Linux系统文件和文件系统
文件除了包含内容外,还包含文件名和一些属性(即"管理信息":文件创建/修改日期、访问权限、文件长度及在磁盘上存放位置)。 这些属性保存在文件的inode (索引节点)中。系统使用的是文件的inode编号
1)、文件类型:
普通文件(-)、目录文件(d)、符号链接文件(l)、字符设备文件(c)、块设备文件(b)、管道文件(p)、socket文件(s)等
2)、Linux文件权限
S_IRUSR 所有者具有读权限
S_IWUSR 所有者具有写权限
S\_IXUSR 所有者具有执行权限
S\_IRGRP 组具有读权限
S\_IWGRP 组具有写权限
S\_IXGRP 组具有执行权限
S\_IROTH 其他用户具有读权限
S\_IWOTH 其他用户具有写权限
S\_IXOTH 其他用户具有执行权限
3)、结构体stat
二)、不带缓存的文件I/O操作
不带缓存的文件I/O操作包括系统调用或API的I/O操作,是由操作系统提供的,符合POSIX标准,设计的程序能在各种支持POSIX标准的操作系统中方便移植。
1)、一般函数:
creat、open、close、read、write、lseek、flock、fcntl
2)、文件的非阻塞操作
文件的读写操作中还有一个阻塞和非阻塞问题。非阻塞打开文件时用flags的一个值O_NONBLOCK来表示,read/write就不会阻塞。
要让文件非阻塞操作时,设置flag |=O_NONBLOCK
要让文件阻塞操作时,设置flag &=~O_NONBLOCK
三)、带缓存的流文件I/O操作
带缓存的流文件I/O操作称为标准I/O操作,符合ANSI标准。在内存中开辟了一个缓存区,为程序中的每一个文件使用。带缓存的件I/O操作比不带缓存的I/O操作程序更方便移植。
1)、主要函数:
fopen、fclose、fread、fwrite、fseek、ftell、rewind、fgetc、fputc、fgets、fputs
四)、命令行参数和特殊文件操作
1)、向程序传递参数
int main(int argc, char *argv[])
2)、一些函数:
getopt getopt\_long
**第六章、进程控制**
一)、什么是进程
一个其中运行着一个或多个线程的地址空间和这些线程所需要的
系统资源,每个运行着的程序实例构成一个进程,进程是由程序代码,数据,变量(占用着系统内存),打开的文件(文件描述符)和环境组成
二)、进程的结构
正文段,用户数据段,系统数据段
1)、进程表
它把当前加载到内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、命令字符串和其他一些PS命令输出的各类信息,OS通过进程的PID对它们进行管理
2)、查看进程
ps指令
3)、进程调度
nice( ) 改变一个普通进程的优先级
getpriority( ) 取得一组普通进程的最大优先级
setpriority( ) 设置一组普通进程的优先级
sched_getscheduler( ) 取得一个进程的调度策略
sched_setscheduler( ) 设置一个进程的调度策略和优先级
sched_getparam( ) 取得一个进程的调度优先级 sched_setparam( ) 设置一个进程的优先级
sched_yield( ) 不阻塞的情况下自愿放弃处理机
sched_get_ priority_min( ) 取得某种策略的最小优先级
sched_get_ priority_max( ) 取得某种策略的最大优先级
三)、启动新进程
1)、一些函数:
调用库函数system()
fork wait waitpid
2)、僵尸进程
fork调用之后子进程便有一个父进程,有两种情况:
父进程先于子进程终止,init进程接管该子进程(孤儿进程)。
子进程先于父进程而终止,退出的进程被置于僵死态,占据内核维护的进程控制表中的一项,但不使用其它的内核资源,即该进程成为一个僵死进程。
3)、僵尸进程解决办法
通过信号机制
通过调用fork两次避免僵死进程原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程
学习体会:
我们知道Linux在服务器端的占比超过90%,尤其是web端,几乎所有公司的后台全部都是Linux的系统。Windows由于成熟的图形界面而在pc端风光无限,但是服务器由于其较高的并发以及cpu负荷较高,windows无法负担,Linux便很适合。我认为学习Linux不仅仅是深入连接Linux那么简单,因为Linux的终端概念,我对cmd也有了更深的理解,它是一个shell外壳,翻译指令给内核。Linux有shell脚本,windows有bat批处理文件,使用了这么久的windows,我完全没有想过这些问题。我对c/c++比较感兴趣,在windows下IDE的过度使用,对编译和调试的理解虽然知道有gcc,g++,gdb之类的东西,但是没有实际操作过,理解很浅。学习了Linux,我也知道了编译c/c++的完整过程,也算是深刻理解吧。我之前接触过cmake,知道它是一种跨平台的工具,在Linux中生成makefile文件,在windows中产生sln文件等等,学习makefile也算是对先前的知识做一个强化理解。今后的学习我们将更多的涉及操作系统方面的知识,比如文件操作,进程,线程,进程通信等等。学习Linux的意义不仅仅是Linux,而是和Linux相关,和操作系统相关,和c/c++相关的一系列知识。
难点疑点:
1)、说实话,vim是一大利器,但是熟练掌握vim的代价太高了,vim的主要吸引点是它能真正解放鼠标,使我们编程速度有个个质的飞跃,但是掌握vim的快捷键太难了,vim配置也相比较IDE麻烦。
2)、C语言,我们虽然之前学过C语言,但是我们的学习说实话是停留在windows的黑框界面中,停留在语法,数据结构,算法上,没有落实到操作系统,没有落实到进程,线程等计算机真正相关的领域,没有一个整合和过程。我们希望通过Linux这门课程,我们可以对c语言的认识不仅停留在这是一门语言上,而更多的是认识这是一门编写了linux,unix的语言,这是一门面向操作系统,面向底层的语言。
3)、进程以及线程的概念。因为我们没有立体接触过,比较生疏,理解还是需要时间的。