版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第2章章 嵌入式嵌入式Linux开发基础开发基础本章主要内容本章主要内容 2.1 Linux的基本操作 2.2 Linux下C程序设计基础 2.3 Linux Shell编程 2.4 Linux进程控制编程 2.5 Linux下的多线程编程2.1 Linux的基本操作的基本操作 2.1.1 用户系统相关命令 2.1.2 文件目录相关命令 2.1.3 压缩打包相关命令 2.1.4 网络相关命令 2.1.5重定向与管道 2.1.6 linux帮助系统2.1.1 用户系统相关命令用户系统相关命令 1、切换到其他用户(、切换到其他用户(su) 相当于Windows系统中的切换用户,主要用于由普通用户
2、身份转变为超级用户。例如:rootlocalhost root# su rayraylocalhost root$ su root 提示符为#表示当前为超级用户,$为普通用户登录状态。转到超级用户也可以只用su命令,不加用户名参数root.2.1.1 用户系统相关命令用户系统相关命令 2、修改用户口令、修改用户口令passwd Passwd可以为新用户创建密码,也可以用于普通帐户修改帐号密码。Linux没有密码回显,所以输入的这些字符用户是看不见的。密码最好包括字母、数字和特殊符号,并设置为六位以上。使用示例:rootlocalhost root# passwd rayChanging pas
3、sword for user ray.New password:Retype new password:passwd: all authentication tokens updated successfully2.1.1 用户系统相关命令用户系统相关命令 3、系统管理命令、系统管理命令 Linux常见系统管理命令2.1.1 用户系统相关命令用户系统相关命令 4、查看当前系统内存的使用情况(、查看当前系统内存的使用情况(free) rootlocalhost root# free total used free shared buffers cachedMem: 255308 250172 5
4、136 0 104604 69796-/+ buffers/cache: 75772 179536Swap: 522104 10300 511804 5、查看文件系统的磁盘空间占用情况(、查看文件系统的磁盘空间占用情况(df) rootlocalhost root# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda2 7637400 4792712 2456720 67% /dev/sda1 101089 9376 86494 10% /bootnone 127652 0 127652 0% /dev/shm.host:
5、/ 276366160 163500796 112865364 60% /mnt/hgfs2.1.1 用户系统相关命令用户系统相关命令 6、查看磁盘分区情况及对磁盘进行分区管理(、查看磁盘分区情况及对磁盘进行分区管理(fdisk) 例如用fidisk l来查看硬盘分区情况:rootlocalhost root# fdisk -l 另外,fidisk也是一个好用的硬盘分区工具。使用fidisk必须要有root权限。 7、磁盘挂载命令(、磁盘挂载命令(mount) 格式:mount选项设备文件的类型 设备文件名 挂载点2.1.1 用户系统相关命令用户系统相关命令 7、磁盘挂载命令(、磁盘挂载命令(
6、mount) 设备文件名是指要装载的设备的名称,如软盘、硬盘、光盘等,软盘一般为/dev/fd0、/dev/fd1,硬盘一般为/dev/hda、/dev/hdb,硬盘逻辑分区一般为期hda1、hda2等等,光盘一般为/dev/hdc。 命令示例:装载一个光盘:mount t iso9660 /dev/hdc /mnt/cd-rom挂载一个SCSI格式的U盘:mount t vfat /dev/sda1 /mnt/u 装载完成之后便可对该目录进行操作,在使用新的软盘及光盘前必须退出该目录,使用卸载命令umount进行卸载,例如:umount /mnt/ cd-rom,才可以使用新的光盘,否则系统
7、不会承认该光盘。光盘要先用命令卸载,才可以按光驱面板前的弹出键弹出碟片。2.1.2 文件目录相关命令文件目录相关命令 1、改换工作目录、改换工作目录 (cd) 格式:cd目录。其中的目录参数可以是绝对路径也可以是相对路径。例如:cd 或 cd 改变目录位置至用户登录时的动作目录。cd dir1 改变目录位置到dir1目录下。cd . 改变目录位置至当前目录的父目录。cd /./.改变目录位置至绝对路径下 2、显示当前目录下的所有文件和目录(、显示当前目录下的所有文件和目录(ls) rootlocalhost /# ls -ltotal 201-rwxr-xr-x 1 root root 148
8、99 Oct 14 14:52 httpddrwxr-xr-x 2 root root 4096 Oct 10 2007 bindrwxr-xr-x 20 root root 118784 Nov 16 2009 devdrwxr-xr-x 56 root root 4096 Sep 17 09:09 etc 由左到右,依次为文件类型和权限 链接数 文件属性 文件属组 文件大小 修改的时间 文件名或目录名。若想列出“.”开头的文件,需使用-a参数。2.1.2 文件目录相关命令文件目录相关命令 3、创建一个目录(、创建一个目录(mkdir) 格式:mkdir目录名。例如:mkdir dir1 建
9、立一个新目录dir1. 4、查看文件内容(、查看文件内容(cat) 例如:# cat /root/.bash_profile-n参数对所有输出的行编号:rootlocalhost /# cat -n /root/.bash_profile一次显示多个文件的内容:cat hello1.c hello2.c 5、复制命令(、复制命令(cp) 格式:cp -r 源地址 目的地址。例如:cp file1 file2 将文件file1复制成file2。cp file1 dir1 将文件file1复制到目录dir1下,文件名仍为file1。cp /tmp/file1 . 将目录/tmp下的文件file1复
10、制到当前目录下,文件名仍为file1。cp /tmp/file1 file2将目录/tmp下的文件file1复制到当前目录下,文件名为file2。cp r dir1 dir2 复制整个目录。-r参数表示递归复制该目录下所有子目录和文件。2.1.2 文件目录相关命令文件目录相关命令 6、移动或更改文件、目录名称(、移动或更改文件、目录名称(mv) 格式:mv 源地址 目的地址。例如:mv file1 file2 将文件file1更名为file2。mv file1 dir1 将文件file1复制到目录dir1下,文件名仍为file1。mv dir1 dir2 将目录dir1更名为目录dir2。 7
11、、删除文件(、删除文件(rm) 格式:rm 文件名.例如:rm file1 删除文件名为file1的文件。rm file? 删除文件中有五个字符且前四个字符为file的所有文件。rm f* 删除文件名中以f为首的所有文件。 rm命令还有三个常用的参数:-i 进行交互式删除,每个文件系统会确实是否删除。-f 禁止交互,不给出是否删除的确认提示。-r 将递归的删除参数中列出的全部目录及其下子目录。例如: rm r dir1 删除目录dir1及其子目录下所有文件。2.1.2 文件目录相关命令文件目录相关命令 8、改变文件或目录的读、写、执行权限(、改变文件或目录的读、写、执行权限(chmod) 格式
12、:chmod -R mode name name: 文件名或目录名。mode:3个8为数字或rwx的组合。r-read(读),w-write(写),x-execute(执行),u-user(当前用户),g-group(组),o-other(其他用户)。例如:chmod 755 dir1 对于目录dir1,设定成任何使用者皆有读取及执行的权限,但只有所有者可以修改。755即rwxrw-rw-。chmod 700 file1 对于文件file1,设定只有所有者可以读、写和执行的权限。700即rwx-。chmod u+x file2 对于文件file2,增加当前用户可执行权限。chmod g+x f
13、ile2 对于文件file3,增加工作组使用者可执行的权限。chmod o-r file4 对于文件file4,删除其他使用者可读取的权限。 使用chmod必须具有root权限。2.1.2 文件目录相关命令文件目录相关命令 9、文件链接命令(、文件链接命令(ln) ln可以为某一个文件在另外一个位置建立一个符号链接,而不必重复地占用磁盘空间。 格式:ln -s老文件名 新文件名rootlocalhost ray# ln -s ./qtopia-install.tar.bz2 ./qtorootlocalhost ray# ls -ltotal 0lrwxrwxrwx 1 root root 2
14、5 Sep 23 20:48 qto - ./qtopia-install.tar.bz2 如果不加参数-s:ln ./qtopia-install.tar.bz2 ./qto将会在用户选定的位置上生成一个和源文件大小相同的文件,称为硬链接,此前为软链接。无论软链接还是硬链接,文件都保持同步变化。2.1.3 压缩打包相关命令压缩打包相关命令 打包是指将一些文件或目录变成一个文件保存,而压缩则是将一个大的文件通过一些压缩算法变成一个占用磁盘资源更少的文件。Linux中打包压缩命令根据压缩格式的不同,可以采用不同的命令,这里只以tar为例进行讲解。 Linux 的软件包一般是以.gz 或.tar
15、或者.tar.gz、.tar.bz2结尾的。 格式:tar 选项 打包后文件名 文件目录列表。使用举例: 把linux-2.4.x.tar.gz解压:tar xzf linux-2.4.x. .tar.gz 把目录linux-2.4.x压缩成一个文件linux-2.4.x.tar.gz:tar czf linux-2.4.x.tar.gz linux-2.4.x 解压缩bz2 格式压缩包:tar -xjf linux.bz2 建立bz2 格式压缩包:tar -cjf linux-2.4.x.tar.bz2 /develop/linux-2.4.x2.1.4 网络相关命令网络相关命令 Linux
16、下网络常用命令有ifconfig、ping、netstat、nslookup等,这里仅以ifconfig为例。 ifconfig需要超级用户权限,用于查看和配置网络接口的地址和参数,包括IP地址、子网掩码、广播地址。用于察看当前系统的网络配置的命令格式是这样的: ifconfig 网络接口网络接口,例如:ifconfig、ifconfig eth0 、ifconfig a 。-a参数可以列出所有接口的信息,包括非活跃接口。用于配置指定接口的IP地址、子网掩码、广播地址的格式为:ifconfig 网络接口网络接口 选项选项 地地址址。使用示例: rootlocalhost root# ifcon
17、fig eth0 netmask rootlocalhost root# ifconfig rootlocalhost root# ifconfig eth0 down rootlocalhost root# ifconfig rootlocalhost root# ifconfig eth0 rootlocalhost root# ifconfig a ifconfig进行网络配置不需要重启就可以生效,但机器重新启动以后就会失效。2.1.5重定向与管道重定向与管道 输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重定向到指定文件中。
18、使命令的输出不显示在屏幕上,而是写入到指定的文件中。输出重定向的一般形式为: 命令文件名。例如: rootlocalhost root# ls / directory.out rootlocalhost root#cat directory.out 如果要将一条命令的输出结果追加到指定文件的后面,可以使用追加重定向操作符。形式为:命令文件名。例如: rootlocalhost root# ls *.log directory.out 程序的错误输出也可以重新定向。使用符号2,或追加符号2,表示对错误输出设备重定向。这时可以在屏幕上看到程序的正常输出结果,但又将程序的任何错误信息送到文件err.
19、file中,以备查看。 还可以使用另一个输出重定向操作符(&)将标准输出和错误输出同时送到同一文件中,例如: rootlocalhost root# ls /usr/tmp & err.file2.1.5重定向与管道重定向与管道 管道将一个程序的输出作为另一个程序或命令的命令。也就是说,管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的管道命令行中最后一个命令的输出(如果命令行中未使用输出重定向)。 管道的命令符为“|”。例如: $cat sample.txt|g
20、rep “High”|wc l2.1.6 linux帮助系统帮助系统 1.、Help命令命令 用法:命令 -help。例如:ls -help 所有的命令都可以用这个方法察看其用法。 2、man命令命令 用法:man 命令。例如:man ls 会列出Linux命令手册中该命令(这里是ls)的完整用法。并进入:命令行状态,这时可以查找、定位等操作,q命令退出。 另外,在命令行输入命令时使用tab健可以帮助你打出完整命令和文件名,非常有帮助。2.2 Linux下下C程序设计基础程序设计基础 Linux下C语言的程序设计与在其他环境中的C程序设计一样,主要涉及到编辑器、编译链接器、调试器以及项目管理工
21、具。 本章中通过对Vi、GCC、GDB、Makefile等的讲解,学习Linux下C程序的开发。 2.2.1 Vi的使用 2.2.2 GCC编译器 2.2.3 GDB调试器的使用 2.2.4 GNU make和makefile2.2.1 Vi的使用的使用 Vi有三种基本的工作模式:命令模式、插入模式和末行模式,它们之间相互转换的关系: Vi在命令模式下的命令非常丰富,而且大小写字母表示不同的命令:在命令模式下的命令非常丰富,而且大小写字母表示不同的命令: 1、输入文件内容,也就是转入插入模式、输入文件内容,也就是转入插入模式i 从光标所在位置前面开始插入;I(大写i) 从光标所在行的第一个非空
22、白字符前面开始插入;a 从光标所在位置后面开始新增内容;A 从光标所在行最后面的地方开始新增内容;o 在光标所在行下新增一行并进入输入模式;O 在光标所在行上新增一行并进入输入模式;2.2.1 Vi的使用的使用 2、光标的移动、光标的移动$ 至行尾;0至行首;nh 将光标移到屏幕的第n行;nl 将光标移到屏幕的倒数第n行;n- 减号移动到上一行的第一个非空白字符,前面加上数字可以指定移动到以上n行;n+ 加号移动到下一行的第一个非空白字符,前面加上数字可以指定移动到以下n行; 3、删除、删除x 删除光标所在字符;X 删除光标前面的字符;dd 删除光标所在的行;D 从光标位置开始删除到行尾; 4
23、、修改、修改r 修改光标所在字符,r后接着要修改的字符。如,rc可以用字符“c”替换光标所指向的当前字符;R 进入替换状态,新增内容会覆盖原先内容,直到按ESC 回到命令模式下为止;2.2.1 Vi的使用的使用 5、复制和移动、复制和移动yy 复制当前行到内存缓冲区;nyy 复制n行内容到内存缓冲区,例如1yy、2yy;p 将缓冲区的内容粘贴到光标的后面;P(大写) 将缓冲区的内容粘贴到光标的前面; 6、搜索字符串、搜索字符串/pattern 移至下一个包含pattern的行;?pattern 移至上一个包含pattern的行;n 在同一方向重复查找;N 在相反方向重复查找;注意:*. $ /
24、包含在查找字符串中,要用转义字符( )。 7、其他、其他u 撤销前一条命令的结果。2.2.1 Vi的使用的使用 Vi在末行模式下的常用操作有:在末行模式下的常用操作有: 1、文件的保存和退出、文件的保存和退出:w 保存;:q 退出;:w! 强制保存;:q! 强制退出;:wq 保存退出;:wq! 强制保存退出:set nu 显示行号; :set nonu 取消显示行号; 2、字符串的替换、字符串的替换:s/str1/str2/ 用str2 替换行中首次出现的字符串str1;:s/str1/str2/g 用str2 替换行中所有出现的字符串str1; 3、编辑多个文件、编辑多个文件$ vi fil
25、e1 file2 打开多个文件后,下面命令可以在不同文件间切换::n 编辑下一个文件; :e file2 编辑指定文件file2。 4、其他、其他:n 将光标移到第n行; :n1,n2 m n3 : 把n1到n2 行内容搬到第n3 行后。2.2.2 GCC编译器编译器 GCC是GNU的C和C+编译器,是一组编译工具的集合。 GCC能够编译多种语言:C、C+和Object C等。 利用GCC命令可同时编译并连接C和C+源程序。 也可以对几个C源文件利用GCC编译、连接并生成可执行文件。 使用GCC编译C语言源程序的编译过程要经过四个阶段才能完成. 预处理阶段 编译阶段 汇编阶段 链接阶段这个阶段
26、,涉及到了一个重要的概念:函数库。一个“程序函数库”就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。函数库可分为静态库和动态库两种类型。2.2.2 GCC编译器编译器 静态函数库(static libraries):是一个普通的目标文件的集合,一般用“.a”作为文件的后缀。静态函数库和共享函数库相比有很多的缺点,占用内存空间多。但使用ELF格式的静态库函数生成的代码可以比使用共享函数库的程序运行速度上快一些。 动态函数库又称为共享函数库(shared libraries):在编译链接
27、是并没有把库文件的代码加入到可执行文件中,而是在程序执行时动态加载的。这样做可以节省系统的开销,使得多进程可以使用同一函数库,而且方便维护,修改函数库不需重新链接编译。动态库一般以字母lib开头,后缀名“.so”在加上版本号,比如libc.so.6。如无参数指定,GCC在编译时默认使用动态库。Linux下函数库通常存放在特定目录中,例如: /lib:系统必备共享函数库; /usr/lib:标准共享函数库和静态函数库; /usr/local/lib:本地函数库;2.2.2 GCC编译器编译器 GCC基本语法为:gcc options filenames 在GCC后面可以有多个编译选项,同时进行多
28、个编译操作。 当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。 下面简单分析介绍一下GCC常用的编译选项。2.2.2 GCC编译器编译器 1、常用编译选项、常用编译选项 -o选项:用-o 编译选项来为将产生的可执行文件指定一个文件名来代替a.out。例如:gcc -o hello hello.c -c选项:告诉GCC仅把源代码编译为目标代码而跳过汇编和链接的步骤。这个选项使用的非常频繁,因为它使得编译多个C程序时速度更快并且更易于管理。缺省时GCC建立的目标代码文件有一个.o的扩展名,例如:gcc -c test.c。 GCC可以将多个源文件生成一
29、个可执行文件。例如# gcc -o mytest test1.c test2.c test3.c ;他相当于gcc -c test1.c;gcc -c test2.c;gcc -c test3.c;gcc -o mytest test1.o test2.o test3.o四条语句的效果。 -E选项:只运行C预编译器。 -S选项:告诉GCC在为C代码产生了汇编语言文件后停止编译。 -shared选项:生成共享目标文件,通常用在建立共享库时。 -static选项:禁止使用共享连接。2.2.2 GCC编译器编译器 2、警告选项、警告选项 -Wall选项:显示所有的警告信息,使用示例命令如下:gcc
30、-Wall -o test1 test1.c -w 不生成任何警告信息,禁止输出警告消息。 3、查找选项、查找选项 GCC一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。 -I dir选项:指定头文件的搜索目录,注意这里选项为大写的i.例:gcc -I /export/home/ray -o test1 test1.c -L dir选项:指定库文件的搜索目录例:gcc -L /usr/williams/lib -o test1 test1.c2.2.2 GCC编译器编译器 4、优化选项、优化选项 优化选项-On可以使GCC在耗费更多
31、编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。建议只有在程序最终发行的时候才考虑使用优化选项对其进行优化。 5、版本选项、版本选项 -v选项:得到目前正在使用的GCC的版本及与版本相关的一些信息,命令# gcc -v ; -V 选项:如果安装了多个版本的GCC,并且想强制执行其中的某个版本,可以用命令通知系统用户要使用的版本。2.2.2 GCC编译器编译器 6、调试和剖析选项、调试和剖析选项 使用调试选项后,GCC在进行编译的时候,在目标文件(.o)和创建的可执行文件中插入额外信息,这些额外信息使GDB能够判断编译过的代码和源代码之间的关系。 -
32、g选项:告诉GCC生成能被GNU 调试器使用的调试信息以便调试你的程序。例:gcc -g -o hello3 hello3.c -pg选项:告诉GCC在你的程序里加入额外的代码,提供进行性能分析所需的信息。 注意,使用调试选项会使最终生成的二进制文件的大小急剧增加,因此调试选项只有在开发和调试阶段使用。 GCC还提供了宏定义选项等,不展开介绍。2.2.3 GDB调试器的使用调试器的使用 调试程序GDB,它是一个用来调试C和C+程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。 要让产生的可执行文件可以用GDB来调试,需在在执行GCC指令编译程序时加上-g参数. 使用
33、GDB 命令的语法: # gdb filename GDB启动后会出现提示符: (gdb) 表示已经入GDB调试状态,可以输入调试命令进行调试。 GDB的调试命令非常丰富2.2.3 GDB调试器的使用调试器的使用 GDB常用调试命令 了解更多: 在Linux Shell提示符下键入man gdb2.2.4 GNU make和和makefile makefile 按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。Makefile 完成自动维护编译工作。 Linux程序员使用文件名Makefile。 Makefile 的基本结构 Makefile
34、规则的一般形式如下:target:dependency dependency(tab) 2.2.4 GNU make和和makefile 一个Makefile实例# Makefile的例子(以#开头的为注释行)test:prog.o code.ogcc o test prog.o code.oprog.o:prog.c prog.h code.hgcc Wall O -g c prog.c o prog.ocode.o:code.c code.hgcc Wall O g c code.c o code.oclean:rm f *.o 调用make命令可输入:# make target 如果省略
35、target,make就将生成Makefile文件中定义的第一个目标2.2.4 GNU make和和makefile Makefile中的变量 Linux下的Makefile文件里面可能会使用非常多的变量,远不像前面示例Makefile文件那样简单。这些变量对大小写敏感,一般使用大写宇母。 定义变量的语法:VARNAME=string 使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值:$(VARNAME)2.2.4 GNU make和和makefile 利用变量把前面的Makefile重写一遍:OBJS=prog.o code.oCC=gccCFLAGS=Wall O -gt
36、est:$( OBJS)$(CC) o test $(OBJS)prog.o:prog.c prog.h code.h$(CC) $( CFLAGS) c prog.c o prog.ocode.o:code.c code.h$(CC) $( CFLAGS) c code.c o code.oclean:rm f *.o2.2.4 GNU make和和makefile Makefile中的变量分为 用户自定义变量 预定义变量 自动变量 环境变量 前面示例中的OBJS就是用户自定义变量 自定义变量的值由用户自行设定。 自动变量通常可以代表编译语句中出现的目标文件和依赖文件等。 预定义变量包含了常
37、见编译器、汇编器的名称及其编译选项2.2.4 GNU make和和makefile Makefile中的常见自动变量2.2.4 GNU make和和makefile Makefile中的常见预定义变量2.2.4 GNU make和和makefile 上面的Makefile文件的例子,可以进一步改写为如下形式:OBJS=prog.o code.oCC=gccCFLAGS=Wall O -gtest:$( OBJS)$(CC) $(OBJS) o $ prog.o:prog.c prog.h code.h$(CC) $( CFLAGS) c $ o $code.o:code.c code.h$(C
38、C) $( CFLAGS) c $ o $clean:rm f *.o2.2.4 GNU make和和makefile Makefile的隐含规则 一些默认的动作,称作隐含规则的内置的规则,这些规则告诉make当用户没有完整地给出某些命令的时候,应该怎样执行。 make使用变量CC来定义编译器,并且传递变量CFLAGS(编译器参数)、CPPFLAGS(C语言预处理器参数)、TARGET_ARCH(目标机器的结构定义)给编译器,然后加上参数-c,后面跟变量$(第一个依赖文件名),然后是参数-o加变量$(目标文件名)。综上所述,一个C编译的具体命令将会是: $ CC $ CFLAGS $ CPPF
39、LAGS $ TARGET_ARCH c $ -o $2.2.4 GNU make和和makefile 上面的例子,利用隐含规则,可以简化为:OBJS=prog.o code.oCC=gcctest:$ OBJS $ CC o $ $prog.o:prog.c prog.h code.hcode.o:code.c code.hclean:rm f *.o 利用autotool系列工具来制作makefile 对于较大的项目而言,手工编写Makefile决不是一件轻松的事情2.3 Linux Shell编程编程 Shell提供了用户与操作系统与用户之间通讯的方式 交互式方式 非交互方式 Shell
40、编程: Shell本身就是一个解释型的程序语言,它支持函数、变量、数组和分支、循环等程序控制结构。 Shell有多种不同的版本,如sh、Bourne Shell、ash、csh、tcsh、ksh、bash、POSIX Shell等。 在大多数版本Linux中都则以bash作为缺省的shell。 Bash: 通用户的shell提示符是“$”,超级用户root提示符则为“#”2.3 Linux Shell编程编程 1、建立脚本、建立脚本 如果shell脚本的第一个非空白字符不是“#”,则它会使用Bourne shell。 如果shell脚本的第一个非空白字符是“#”,但不以“#!”开头时,则它使用
41、C shell。 如果shell脚本以“#!”开头,则“ #!”后面所跟的字符串就是所使用的shell的绝对路径名。Bourne shell的路径名称为/bin/sh,而C shell则为/bin/csh。 例如: (1)如使用Bourne shell,可用以下方式:echo enter filename 或者 #! /bin/sh (2)如使用C shell,可用以下方式:#C shell Script 或者 #! /bin/csh (3)使用Linux默认的bash shell:#! /bin/bash2.3 Linux Shell编程编程 2、脚本的执行、脚本的执行 (1)使用chmod
42、命令把shell脚本的权限设置为可执行,这样就可以在提示符下直接执行。例如:# chmod +X myshell # ./myshell这时由shell文件开头指明的shell解释执行。 (2)指定shell脚本想要执行的shell,其后跟随shell脚本的文件名作为命令行参数。例如,使用tcsh 执行上面的shell脚本myshell:# tcsh myshell 此命令启动一个新的shell,并令其执行myshell 文件。 (3)第三种方法是在pdksh和bash下使用 . 命令,或在tcsh下使用source命令。例如,在pdksh和bash下执行上面的shell脚本: # . mys
43、hell 要注意. 和shell脚本文件名之间有一个空格。在tcsh下执行上面的shell脚本: # source myshell . 命令和source命令的执行方式,在bash下一样可以使用。2.3 Linux Shell编程编程 3、shell变量变量 Shell编程中可以使用变量,这赋予了shell脚本充分的灵活性。 Shell语言是一种不需要类型检查的解释语言,所以在使用变量之前无须事先定义。可以使用同一个变量来存储字符串或整数。 给字符串赋值的方法和给整数赋值的方法一样。例如:在pdksh 和bash中:name=Garry count=5 注意,在等号的两边不能有空格。 读取该变
44、量的值,要在变量名前面加上一个符号“$”。例如,用echo $count 命令将count变量的内容输出到屏幕上。 Shell脚本中的变量主要有用户变量、环境变量、位置变量、预定义变量。2.3 Linux Shell编程编程 Shell用户变量用户变量名以字母或下划线字符开始,由字母、数字或下划线组成,赋值和读取如前面的count 环境变量环境变量是在启动shell时就已经存在于系统中的系统变量,例如:$HOME、$PATH、$PWD等等。可以直接使用这些变量,也可以给它们赋予新值。可以像定义一个变量一样来设置环境变量,在标记它为环境变量时需要使用“export”命令。示例如下:$ expor
45、t MYENV=1$ echo $MYENV 使用“set”命令可以获取当前上下文中全部的变量:rootlocalhost root# set2.3 Linux Shell编程编程 位置变量位置变量用来存储shell程序后面所跟的参数。第一个参数存储在变量1中,第二个参数存储在变量2中,依次类推。 这些变量为系统保留变量,所以你不能为这些变量赋值。 使用$来读取这些变量的值。在shell中总共有十个位置变量,其对应的名称依次是$0,$1,$2,.$9。其中$0始终表示命令名或Shell脚本名 例如,编写一个外壳脚本程序reverse。输出时,将两个变量的位置颠倒。Shell脚本内容只有两行,内
46、容如下:#program name:reverse, prints the command line parameters out in reverse orderecho $2 $1 脚本中第一行位注释行,注明程序的功用。在外壳下执行此脚本程序:# . reverse hello there 其输出如下:there hello2.3 Linux Shell编程编程 预定义变量预定义变量是在执行外壳程序时系统就设置好了,并且你不能加以修改的变量: $# 存储外壳程序中命令行参数的个数。 $? 存储上一个执行命令的返回值。 $0 存储外壳程序的程序名。 $* 存储外壳程序的所有参数。 $ 存储所
47、有命令行输入的参数,分别表示为(“$1”“$2”. . . )。 将前面的reverse修改成recerse2:#program name:reverse2, prints the command line parameters out in reverse orderecho “There are $# parameters ”;echo “The shell script name is $0”;echo “The parameters in this script are: $”;echo “The parameters in this script are: $*”;echo $2 $
48、1 执行查看脚本运行输出情况:rootlocalhost root# . recerse 11 22 33“There are 3 parameters ”“The shell script name is bash”“The parameters in this script are: 11 22 33”“The parameters in this script are: 11 22 33”22 11rootlocalhost root# echo $?0 返回值为0,表明该命令正确执行,任何非0值表示命令出错。2.3 Linux Shell编程编程 4、shell中的特殊字符中的特殊字符
49、 (1)通配符 通常的通配符有三种: * 星号:它匹配任意字符的0次或多次出现。但注意,文件名前面的圆点(.)和路径名中的斜线(/)必须显式匹配。? 问号:它匹配任意一个字符。 一对方括号:其中有一个字符组。其作用是匹配该字符组所限定的任意一个字符。注意:字符* 和?在一对方括号外面是通配符,若出现在其内部,它们就失去通配符的能力了。! 叹号,若它紧跟在一对方括号的左方括号之后,则表示不在一对方括号中所列出的字符。2.3 Linux Shell编程编程 4、shell中的特殊字符中的特殊字符 (2)引号双引号”: 由双引号括起来的字符,除$、倒引号和反斜线()仍保留其功能外,其余字符通常作为普
50、通字符对待。单引号 :由单引号括起来的字符都作为普通字符出现。倒引号 :倒引号用于设置系统命令的输出到变量。shell 将反引号中的内容作为一个系统命令,并执行其内容。 (3)反斜线转义字符: 若想在字符串中使用反斜线本身,则必须采用()的形式,其中第一个反斜线作为转义字符,而把第二个反斜线变为普通字符。2.3 Linux Shell编程编程 5、shift命令命令 shift命令的作用是把位置参数左移。原来在$2中的内容赋给$1,$3中内容赋给$2,依此类推。这样,原来$1中的值就丢失了,$#(参数变量的个数)也自动减1. 6、test命令命令 test也是shell的一条内部命令,经常用来
51、在if命令中测试一种或几种条件,其一般格式为:test expression 。其中expression表示要测试的条件。test计算expression,若结果为真,其返回的退出状态为0,若结果为假,返回的退出状态就不为零。应用示例:name=bctest “$name” = bcecho $? 注意:test把所有操作数($name和bc)和操作符=都作为单独的参数分别对待,也就是说它们之间至少要有一个空白字符分隔。2.3 Linux Shell编程编程 另一种公认的命令格式,相当于test expression 在“之后和”之前都要有空格。这时,上面的例子可如下表示:name=bc “$
52、name” = bc echo $? test整数操作符:2.3 Linux Shell编程编程 test文件操作符 例如: “$count” eq 0 ,检测两个整数是否相等; -f /etc/fstab ,检测fstab文件是否存在且是否为普通文件。2.3 Linux Shell编程编程 7、流程控制、流程控制 (1)条件判断:shell中有if和case两种条件判断语句。if表达式表达式的一般结构:if command1 thenelif command2 then elseficase表达式的一般结构:case string instring1 )command1;string2 )c
53、ommand2;* )commandn;esac2.3 Linux Shell编程编程 (2)循环语句 shell中有三个内部循环命令:for、while、 until。for命令用来将一组命令循环执行预先确定的次数,基本格式: for var in word1 word2wordndocommandcommand DoneWhile语句的基本格式:while command1docommanddone2.3 Linux Shell编程编程先执行command1,并检测其退出状态,如果为0则执行do与done之间命令,再次检测直到command1退出状态不为0。如果第一次执行command1时
54、退出状态就不为0,那么do和done之间的命令可能根本不执行。 until命令跟while很像,区别在于只要在until后面的命令退出状态不为0,循环就一直执行下去,其格式为:until command1docommanddone 跟while命令一样,如果第一次执行command1时返回的退出状态为0,do和done之间的命令可能跟本不会执行。 (3)break命令与continue命令 break命令与continue命令与C中相应命令功能相同。2.3 Linux Shell编程编程 8、函数的定义和调用、函数的定义和调用 一个函数是一个子程序,用于实现一串操作的代码块,完成特定任务。 函
55、数的定义格式如下:funcname()mand2.3 Linux Shell编程编程 一个简单函数应用的例子testfun,其shell脚本如下:#!/bin/bashfun ()if -z $1 then echo -Parameter #1 is zero length.-else echo -Param #1 is $1.-fifunfun hello2.3 Linux Shell编程编程 运行testfun脚本:rootlocalhost root# . testfun-Parameter #1 is zero length.-Param #1 is hello.-2.4 Linux进
56、程控制编程进程控制编程 2.4.1 Linux进程概述 2.4.2 Linux进程编程 2.4.3 Linux进程通信2.4.1 Linux进程概述进程概述 Linux是一个多用户多任务的操作系统,每个用户都可以同时运行多个程序。 进程程序的运行实体,包括了运行的创建、调度和消亡的整个过程。当用户键入一个命令或启动一个程序时,就启动了一个进程。 一个运行着的程序,可能有多个进程。每个进程将被分配各种资源。 Linux用分时管理方法使所有的任务共同分享系统资源,进程就是系统调度的基本单位。 进程控制块(Process Contro1 B1ock,简称PCB)是用来记录进程状态及其他相关信息的数据
57、结构,PCB是进程存在的唯一标志。 进程控制块由task_struct数据结构实现。可在include/linux/sched.h中查看它的详细定义。2.4.1 Linux进程概述进程概述 进程的标识 进程标识包括进程号、用户标识、用户组标识、进程时间、资源利用情况等。 进程号,也就是PID,唯一的标识一个进程。 进程的父进程号(PPID)也是一个主要的标识。父进程:创建调用该函数进程的进程。 PID和PPID都是一个非零正整数。 在Linux中可以通过系统调用 getpid 可以得到进程的 ID,而 getppid 可以得到父进程(创建调用该函数进程的进程)的ID. 函数原型如下:#incl
58、ude ; /*函数所需头文件*/pid_t getpid(void); pid_t getppid(void);2.4.1 Linux进程概述进程概述 进程的状态 Linux进程有以下状态: 执行态(Running):进程处于运行(它是系统的当前进程)或者准备运行状态(它在等待系统将CPU分配给它)。等待态(Waiting):进程在等待一个事件或者资源。Linux将等待进程分成两类;可中断与不可中断。可中断等待进程可以被信号中断;不可中断等待进程直接在硬件条件等待,并且任何情况下都不可中断。停止态(Stopped):进程被停止,通常是通过接收一个信号。正在被调试的进程可能处于停止状态。 僵尸
59、态(Zombie):这是由于某些原因被终止的进程,但是在task数据中仍然保留task_struct结构。它象一个已经死亡的进程。2.4.2 Linux进程编程进程编程 四个用于控制进程的系统调用: (1)fork:用于创建一个进程; (2)exec:在进程中执行一个文件; (3)exit:使进程自我中止; (4)wait:等待子进程中止。2.4.2 Linux进程编程进程编程 1、fork fork(): 创建一个新进程 进程中可以用fork来创建它的子进程,原进程则为父进程。这两个进程分别带回它们各自的返回值。父进程的返回值是子进程的进程号,而子进程返回值为0。可以通过返回值来判断此时是父
60、进程还是子进程。 子进程是父进程的副本,它获得父进程数据空间、堆、栈等资源的副本。这使得fork函数的执行速度不会太快。 fork系统调用的基本语法:所需头文件: #include 函数定义:int fork( void );返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。2.4.2 Linux进程编程进程编程 fork使用实例(forkfun.c): #include #incl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 楼盖课程设计实例
- 2024年版汽车销售按揭服务合同
- 指南车课程设计
- 瑜伽开髋体式课程设计
- 2024版企业合同管理制度范本
- 二零二五年交通协管员交通信号灯维护服务合同模板3篇
- 自制豆浆课程设计图
- 2024汽车制造公司与供应商采购合同
- 二零二五年度睿联带压封堵技术成熟太阳能热水器漏点修复合同2篇
- 2024年装饰工程GRC线条安装合同版B版
- 2024二人合伙经营项目简单协议书
- 小学数学班级学情分析报告
- IMCA船舶隐患排查表
- 2024年软件开发调试合同样本(二篇)
- 地理月考分析及改进措施初中生
- MOOC 研究生学术规范与学术诚信-南京大学 中国大学慕课答案
- Q-GDW 738-2012 配电网规划设计技术导则及编制说明
- 乡村篮球比赛预案设计
- 2024年全国版图知识竞赛(小学组)考试题库大全(含答案)
- 博物馆保安服务投标方案(技术方案)
- 陕西省幼儿教师通识性知识大赛考试题库(含答案)
评论
0/150
提交评论