Linux程序设计知识点整理.docx

上传人:b****6 文档编号:3427898 上传时间:2022-11-23 格式:DOCX 页数:84 大小:3.45MB
下载 相关 举报
Linux程序设计知识点整理.docx_第1页
第1页 / 共84页
Linux程序设计知识点整理.docx_第2页
第2页 / 共84页
Linux程序设计知识点整理.docx_第3页
第3页 / 共84页
Linux程序设计知识点整理.docx_第4页
第4页 / 共84页
Linux程序设计知识点整理.docx_第5页
第5页 / 共84页
点击查看更多>>
下载资源
资源描述

Linux程序设计知识点整理.docx

《Linux程序设计知识点整理.docx》由会员分享,可在线阅读,更多相关《Linux程序设计知识点整理.docx(84页珍藏版)》请在冰豆网上搜索。

Linux程序设计知识点整理.docx

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、-anewer、-atime

-cmin、-cnewer、-ctime

-empty、-gidor-group、-pid

-name,-iname

-size、-type

-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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1