Linux程序设计知识点整理.docx
- 文档编号:3427898
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:84
- 大小:3.45MB
Linux程序设计知识点整理.docx
《Linux程序设计知识点整理.docx》由会员分享,可在线阅读,更多相关《Linux程序设计知识点整理.docx(84页珍藏版)》请在冰豆网上搜索。
Linux程序设计知识点整理
Prerequisite
一、Linux命令
1、文件操作
列出目录内容:
ls,dir,vdir
创建特殊文件:
mkdir,mknod,mkfifo
文件操作:
cp,mv,rm
修改文件属性:
chmod,chown,chgrp,touch
查找文件:
locate,find
字符串匹配:
grep(egrep)
其它:
pwd,cd,ar,file,grep,tar,more,less,head,tail,cat
2、进程操作
ps,kill,jobs,fg,bg,nice
3、其它
who,whoami,passwd,su,uname,…
man
二、Linux工具
编辑工具:
vi,emacs
编译、链接:
gcc(GNUCCompiler->GNUCompilerCollection)
调试:
gdb
make命令
版本控制工具:
CVS等
三、编程语言
1、High-levelLanguage:
C/C++,Java,Fortran…
2、ELFbinaryformat:
ExcutableandLinkableFormat(工具接口标准委员会(TIS)选择了正在发展中的ELF体系上不同操作系统之间可移植的二进制文件格式)
四、GCC使用
-E:
只对源程序进行预处理(调用cpp预处理器)
-S:
只对源程序进行预处理、编译
-c:
执行预处理、编译、汇编而不链接
-ooutput_file:
指定输出文件名
-g:
产生调试工具必需的符号信息
-O/On:
在程序编译、链接过程中进行优化处理
-Wall:
显示所有的警告信息
-Idir:
指定额外的头文件搜索路径
-Ldir:
指定额外的库文件搜索路径
-lname:
链接时搜索指定的库文件
-DMACRO[=DEFN]:
定义MACRO宏
Gcc过程:
预处理、编译、汇编、链接
GDB使用
设置断点、监视变量值、单步执行、修改变量值
make[-ffilename][targetname]
Shell编程
一、Shell概述
1、Shell
用户和操作系统之间的接口、作为核外程序而存在
2、Shell的双重角色
1)、命令解释程序
(1)Linux的开机启动过程:
加载BIOS;读取MBR(MasterBootRecord);BootLoader;加载内核;用户层init依据inittab文件来设定运行等级;init进程执行rc.sysinit;启动内核模块;执行不同运行级别的脚本程序;执行/etc/rc.d/rc.local;执行/bin/login程序,进入登录状态
(2)进程树:
进程树是一种进程关系表示方法。
由父进程和子进程两部分组成。
(3)Shell的工作步骤:
打印提示符;得到命令行;解析命令;查找文件;准备参数;执行命令
2)独立的程序设计语言解释器
(1)KISS(KeepItSmallandStupid)
(2)Reusabletools
(3)Redirectionandpipe
二、创建和执行Shell程序
1、编写脚本文件(注释、退出码(exit0))
2、执行脚本文件
方法1:
$shscript_file
方法2:
chmod+xscript_file(chown,chgrpoptionally)
./script_file
方法3:
sourcescript_file,or.script_file
1、在当前bash环境下新建一个子shell来执行这个脚本,继承父Shell的环境变量,用于执行刚修改的初始化文档,
2、这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务。
由于是在子shell中执行,脚本设置的变量不会影响当前shell。
3、source的程序主体是bash,脚本中的$0变量的值是bash,而且由于作用于当前bash环境,脚本中set的变量将直接起效
三、Shell程序设计的语法
1、变量
1、用户变量:
(1)定义:
用户在shell脚本里定义的变量
(2)赋值和使用:
var=value
echo$var
(3)read命令:
(read-p"Enteryourname:
"name)
readvar或read
REPLYvariable(环境变量REPLY中包含输入的所有数据,可以像使用其他变量一样在shell脚本中使用环境变量REPLY,当然,在引用的时候不要忘记$)
-s:
默读、在输入密码时用的到
-t:
计时输入,后接等待秒数
(4)引号的用法:
双引号作用:
$,\,`这些字符的特殊含义还是存在
单引号:
忽略所有的特殊字符
2、用户环境
(1).bash_profile,.bash_logout,.bashrcfiles
.bash_profile:
用户登录时被读取,其中包含的命令被bash执行
.bashrc:
启动一个新的shell时读取并执行
.bash_logout:
登录退出时读取执行
(2)Alias:
alias[别名]=[指令名称],若不加任何参数,则列出目前所有的别名设置。
alias的效力仅及于该次登入的操作。
若要每次登入是即自动设好别名,可在/etc/profile或自己的~/.bashrc中设定指令的别名。
Unalias[别名]
(3)环境变量:
export[-fnp][变量名称]=[变量设置值]
-f 代表[变量名称]中为函数名称。
-n 删除指定的变量。
变量实际上未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
env:
显示当前用户的环境变量;
set:
用set命令可以设置各种shell选项或者列出shell变量
-a标示已修改的变量,以供输出至环境变量。
-b使被中止的后台程序立刻回报执行状态。
-C转向所产生的文件无法覆盖已存在的文件。
-dShell预设会用杂凑表记忆使用过的指令,以加速指令的执行。
-d参数可取消。
-e若指令传回值不等于0,则立即退出shell。
-f取消使用通配符。
-h自动记录函数的所在位置。
-HShell可利用"!
"加<指令编号>的方式来执行history中记录的指令。
-k指令所给的参数都会被视为此指令的环境变量。
-l记录for循环的变量名称。
-m使用监视模式。
-n只读取指令,而不实际执行。
-p启动优先顺序模式。
-P启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t执行完随后的指令,即退出shell。
-u当执行时使用到未定义过的变量,则显示错误信息。
-v显示shell所读取的输入值。
-x执行指令后,会先显示该指令及所下的参数。
+<参数>取消某个set曾启动的参数。
3、环境变量(Shell环境提供的变量。
通常使用大写字母做名字)
4、参数变量和内部变量
调用脚本程序时如果带有参数,对应的参数和额外产生的一些变量。
2、条件测试
1、字符串比较
2、算数比较
3、与文件有关的条件测试
4、逻辑操作
5、条件语句
(1)形式:
(紧凑形式;(同一行上多个命令的分隔符))
if[expression]
then
statements
elif[expression]
then
statements
elif…
else
statements
fi
6、case语句
(1)形式:
casestrin
str1|str2)statements;;
str3|str4)statements;;
*)statements;;
Esac
3、重复语句
1、for语句:
适用于对一系列字符串循环处理
(1)形式:
forvarinlist
do
statements
done
例:
#!
/bin/sh
forfilein$(lsf*.sh);do
lpr$file
done
exit0
2、while语句
(1)形式:
whilecondition
do
statements
done
3、until语句(不推荐使用)
(1)形式:
untilcondition
do
statements
done
4、Select语句:
生成菜单列表
(1)形式:
selectiteminitemlist
do
statements
done
4、命令表业语句块
1、命令表
(1)命令组合
分号串联:
command1;command2;…
条件组合:
AND命令表:
只有在&&左边的命令返回真,&&右边的命令才会被执行
格式:
statement1&&statement2&&statement3&&…
OR命令表:
只有在||左边的命令返回假,||右边的命令才会被执行。
格式:
statement1||statement2||statement3||…
2、语句块
(1)形式
{
statement1
statement2
…
}
或{statement1;statement2;…;}
5、函数
(1)形式
[function]funcname()
{
statements
[returnint]
}
(2)局部变量:
局部变量只适用于当前shell,local关键字
(3)函数的调用:
funcpara1para2…
6、其他
1、杂项命令:
break:
从for/while/until循环退出
continue:
跳到下一个循环继续执行
exitn:
以退出码”n”退出脚本运行
return:
函数返回
export:
将变量导出到shell,使之成为shell的环境变量
set:
为shell设置参数变量
unset:
从环境中删除变量或函数
trap:
指定在收到操作系统信号后执行的动作
“:
”(冒号命令):
空命令
“.”(句点命令)或source:
在当前shell中执行命令
2、find命令
(1)形式:
find[path][options][tests][actions]
Options
Tests
可以用操作符进行组合测试:
!
(-not);-a(-and);-o(-or)
可以用圆括号来强制测试和操作符的优先级,需要用到转义字符\
例:
find.\(-name"_*"-or-newerwhile2\)-typef–print
-amin
-cmin
-empty、-gid
-name
-size
-ipath
-path
路径名符合p的文件,ipath表示忽略大小写
actions
3、grep命令(用于在文件中查找字符串)
(1)形式:
grep[OPTIONS]PATTERN[FILES]
(2)正则表达式:
广泛用于Linux和许多其他编程语言中,基本原理都是一样的
注:
上表中的括号需要使用转移字符’\’,如grep–E[a-z]\{10\}words2.txt
4、捕获命令输出
(1)语法:
$(command)
`command`
(2)例:
#!
/bin/sh
echo“Thecurrentdirectoryis$PWD”
echo“Thecurrentdirectoryis$(pwd)”
exit0
5、算数扩展
(1)expr命令(支持的operator包括)
exprargumentoperatorargument
(2)$((…))扩展
例:
x=$(($x+1))
6、参数扩展
#!
/bin/sh
i=0
while[“$i”–ne10];do
touch“${i}_tmp”
i=$(($i+1))
done
exit0
7、即时文档
在shell脚本中向一条命令传送输入数据
#!
/bin/bash
cat<
CATINPUT!
Hello,thisisaheredocument.
!
CATINPUT!
8、shell脚本调试
*sbin/service:
它本身是一个shell脚本程序,作用就是获取传递给它的两个参数:
$1$2,分别是服务名和对该服务的动作。
然后调用/etc/rc.d/init.d/服务名称($1),并给该服务脚本传递你指定的动作($2)。
例如:
servicehttpdstop
本身就是执行:
/etc/rc.d/init.d/httpdstop。
由httpd脚本去控制httpd服务的停止动作(stop)。
文件系统
1、文件系统定义
1、基本定义
文件:
一个可以被读写的对象。
文件有一定的属性,包括访问权限和类型
文件系统:
文件和其某一些属性的集合。
它为指向文件的序列号提供了一个名空间文件系统由三部分组成:
与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。
文件类型:
regularfile、characterspecialfile、blockspecialfile、fifo、socket、symboliclink、directory(普通文件、特殊字符文件、块文件、命名管道、套接字、符号连接、目录)
文件结构:
Bytestream;noparticularinternalstructure(字节流、无特殊内部构造的文件)
*ls–l命令
2、文件系统层次结构
3、文件系统的多种含义:
(1)一种特定的文件格式(Ext2、FAT16、NTFS、FAT32)
(2)指按照特定格式“格式化”的一块存储介质(“安装”、“卸载”一个文件系统)
(3)指操作系统中(通常指在内核中)用来管理文件系统以及对文件进行操作的机制及其实现
4、创建一个文件系统
(1)创建一个文件:
ddif=/dev/zeroof=/work/file.imgbs=1kcount=10000
(2)用作块设备:
losetup/dev/loop0/work/file.img
mke2fs–c/dev/loop010000
mkdir/mnt/testfs
mount–te2fs/dev/loop0/mnt/testfs
5、Linux中的文件系统(VFS:
VirtualFilesystemSwitch)
(1)每个进程通过“打开文件”(open())与具体的文件建立起连接,或者说建立起一个读写的上下文。
这种连接以一个file数据结构为代表,结构中有个file_operations结构指针f_op。
(2)将file结构中的指针f_op设置成指向某个具体的file_operations结构变量,就指定了这个文件所属的文件系统,并与具体文件系统所提供的一组函数挂上了钩
VFS模型是虚拟的,只在内存中出现,包含如下组成:
superblock、i-nodeobject、fileobject、dentryobject
(1)超级块(superblock,了解数据结构):
s_list:
指向超级块链表的指针
*s_type:
文件系统类型
*s_op:
超级块方法
s_instances:
该类型文件系统
(2)索引节点(inode,了解数据结构):
*i_op:
索引节点操作表
*i_fop:
该索引节点对应文件的文件操作集
*i_sb:
相关的超级块
(3)目录(dentry,了解数据结构)
目录项对象,一个路径的各个组成部分,不管是目录还是文件,都是一个dentry对象
*d_inode:
相关的索引节点
*d_parent:
父目录的目录项对象
d_name:
目录项的名字
d_subdirs:
子目录
*d_op:
目录项操作表
*d_sb:
文件超级块
目录项布局:
目录项内容包括索引节点编号,目录项名称长度以及名称本身。
(4)文件(file)
已打开的文件在内存中的表示:
6、进程和文件系统
7、Ext2文件系统
(1)GDT(groupdescriptortable)
每个块组信息,例如inode表起始位置;数据区起始位置,所有这些块组描述符构成GDT;每个group中都有一份GDT,以做备份
(2)Blockbitmap:
块位图
描述blockgroup中每个block是否被使用;本身占据一个block,每个block占据一个bit,假设block大小是1024byte;那么总共可以描述:
1024*8=8192个block信息,1:
表示已占用;0表示未占用
(3)Inodebitmap
(4)Inodetable
块组中所有的inode构成inode表,每个inode对应一个物理文件;Inodetable的空间大小在格式化时候决定;Mke2fs默认块组有多少个8KB,就分配多少个inode
(5)datablock
对于常规文件,文件的数据存储在数据块中
目录文件:
该目录下所有的文件名和目录名存储在数据块中
符号链接:
如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存
设备文件:
fifo,socket文件等没有数据块,设备文件的major,minornumber保存在inode中
*目录:
一种特殊文件,其文件内容是该目录中的目录项
8、HardLink、SoftLink
(1)Hardlink
不同的文件名对应同一个inode
不能跨越文件系统
对应系统调用link
(2)Symboliclink
存储被链接文件的文件名(而不是inode)实现链接
可跨越文件系统
对应系统调用symlink
9、数据块寻址
(1)Inode->block[15]数组
(2)Block[12-14]:
间接索引
Block[12]:
b/4
Block[13]:
b/4*b/4
Block[14]:
b/4*b/4*b/4
2、系统调用和库函数
1、比较:
相同点:
都以C函数的形式出现
不同点:
系统调用:
Linux内核的对外接口;用户程序和内核之间唯一的接口;提供最小接口
库函数:
依赖于系统调用;提供较复杂功能
2、可缓冲和非缓冲的I/O
(1)UnbufferedI/O
read/write->Systemcalls
Filedescriptor
不在标准化C中,但是存在于POSIX.1和XPG3
(2)BufferedI/O
用标准I/O实现
处理很多细节,如缓存分配,以优化长度执行I/O等.
Stream->apointertoFILE
3、基本I/O系统调用
1、文件描述符:
无符号整数表示的句柄
在
STDIN_FILENO(0),STDOUT_FILENO
(1),STDERR_FILENO
(2)
打开文件操作基本流程:
open-read/write-[lseek]-close
2、基本I/O操作
3、错误处理
(1)采用UNIX风格,返回错误代号”errno”,errno变量和错误代码都在头文件/usr/include/errno.h中定义
(2)strerror&perror
char*strerror(interrnum);voidperror(constchar*msg);
4、open/creat函数(打开或者有可能创建一个文件)
#include
#include
#include
intopen(constchar*pathname,intflags);
intopen(constchar*pathname,intflags,mode_tmode);
intcreat(constchar*pathname,mode_tmode);
*creat(pathname,mode)等价于open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode)
返回值:
成功时返回文件的描述符,失败时返回-1
参数:
(1)flags(除了O_RDONLY、O_WRONLY、O_RDWR以外的):
O_APPEND:
以追加方式打开
O_TRUNC:
:
如果文件已经存在并且是一个普通文件且打开方式允许写操作,则文件长度被截0
O_CREAT:
如果文件不存在则创建
O_EXCL:
如果文件已经存在则错误返回
(2)mode:
如果新文件被创建设置其属性
*umask机制:
新创建文件的权限为:
mode&~umask
目录默认:
777,文件默认:
666
5、close函数
#include
intclose(intfd);
返回值:
成功则返回0,失败则返回1
6、read/write函数
#include
ssize_tread(intfd,void*buf,size_tcount);
返回值:
读到的字节数,若已到文件尾为0,若出错为-1
ssize_twrite(intfd,constvoid*buf,size_tcount);
返回值:
若成功为已写的字节数,若出错为-1
7、lseek函数:
定位文件中的读写位置
#include
#include
off_tlseek(intfildes,off_toffset,intwhence);
返回值:
如果成功则返回地址的偏移量,失败则返回-1
参数whence:
SEEK_SET:
从文件开头计算偏移量
SEEK_CUR:
从文件当前的位置开始计算偏移量
SEEK_END:
从文件结尾的位置开始计算偏移量
8、dup/dup2函数:
复制文件描述符
*文件描述符在形式上是一个非负整数。
实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。
dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。
dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符。
#include
intdup(intoldfd);
intdup2(intoldfd,intnewfd);
返回值:
成功则返回文件新的描述符,失败则返回-1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 程序设计 知识点 整理
![提示](https://static.bdocx.com/images/bang_tan.gif)