• 1. Linux基础知识培训Linux历史、发展 Linux基本操作 Linux驱动程序简介 Linux程序设计 Linux公社 http://www.linuxidc.com
  • 2. Linux公社(LinuxIDC.com)Linux公社(LinuxIDC.com)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。 LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。
  • 3. Linux的历史和发展 Unix,Linux,GNU简介什么是Unix Unix操作系统最初是由贝尔实验室(Bell Liboratory)研究开发的,20世纪70年代为DEC(数字设备公司,现在的compaq)的PDP系列计算机设计,现在已经成为非常流行的多用户、多任务操作系统,可运行在多种不同的硬件平台上。 Unix是AT&T的组册商标. Unix是由Open Group(开放组织)管理的一个商标,源码属于SCO公司。有许多商用的Unix系统如SCO的Unixware,IBM的AIX,HP的HP-UX,SUN的Soloris,以及一些可以免费获取的版本如FreeBSD和Linux。 Unix的哲学: 简单性:小而简单(许多Unix工具都很小而且简单易于理解) 集中性:把小工具组合起来完成复杂的任务,而不是把所有功能放在一个大程序里 可重用组件:将核心应用程序以库的形式存在,以共享资源 开放的文件格式:配置文件、数据文件均使用文本
  • 4. 什么是Linux Linux是一个类Unix内核并可以自由发挥的实现,是一个操作系统的底层核心。Linux以Unix为源,所以Linux和Unix的程序是非常相似的,事实上几乎所有为Unix写的程序都可以在Linux上面编译运行。 Linux是由Linus Torvalds在1991年开发出来的,后来得到英特网上广大Unix程序员的帮助而逐步完善成为一个拥有自己版权的完整系统,目的是保证Linux除包含自由发布的代码外,不会集成任何私有的代码。 1991.8 Linus Torvalds发布一个大概有1万代码能运行在386机器上的程序; 1994.3 Linux1.0发布; 1995年 Linux组册用户超过10万,可运行在流行的pc如Intel,Ditital和sun SPARC处理器上; 1998年是Linux发展最快的一年,同年RedHat5.0发布; 随后Linux相继发布了linux 2.3(过度),2.4(正式版本),2.5(过度版本),2.6版本,目前Linux2.4.x已经很少更新,开发人员均转向Linux2.6.x版本 Linux的历史和发展 Unix,Linux,GNU简介
  • 5. Linux的历史和发展 Unix,Linux,GNU简介GNU GNU‘s Not Unix!  http://www.gnu.org/ -创建和Unix系统兼容但不受Unix条款(名字和源代码私有权)的操作系统和开发环境。 是一个OSS(OPEN SOURCE SYSTEM)计划的社区组织。1971年,Richard Stallman作为哈佛学生,找到了一份麻省人工智能实验室AI的工作,这期间里,Hacker的传统被他发展成为日后自由软件运动的思想核心:“思想共享,源码共享”。他于1984年创立了GNU,1985年创建了FSF(自由软件基金会),1991年公布了GPL2.0版(General Public License),普遍公用许可。 现在我们使用的Linux源码和应用程序代码都是在GPL协议下发布的。 GPL下发布的比较出名的项目有: GCC:GNU编译器集,包括GNU C编译器 G++:C++编译器 GDB:源码级调试工具 GNU make:Unix make命令集的免费版本 Bash:命令解析器(shell) GNU Emacs:文本编辑器
  • 6. Linux使用简介Linux图形界面 Linux是一个基于命令行的操作系统,本身不带图形界面,现在我们看到的类Windows界面都是应用程序实现的,和Microsoft windows操作系统有区别; RedHat xWindow x是一个协议,类似于http,ftp这样的协议,操作系统有一个x服务器(xServer),应用程序通过x协议来建立图形界面。 KDE 他不仅是一个窗口管理器,还有很多配套的应用软件和方便使用的桌面环境,比如任务栏,开始菜单,桌面图标等等. GNOME GNOME是GNU Network Object Model Environment 的缩写.和KDE一样,也是一个功能强大的综合环境.
  • 7. 登录Linux Linux是一个真正的多用户操作系统,容许多个用户同时登录 Console Console串口登录在嵌入式linux用得很多,在PC上面用的相对少些(PC上登录大多使用图形界面登录) Telnet 和ftp,pop一样使用明文传送用户信息和数据,不安全,容易泄露用户秘密 优势:短小易用,适合于嵌入式操作系统 SSH 传统的网络服务程序,但SSH会对传送数据加密,SSH比较庞大,不适合嵌入式操作系统,一般用于PC桌面 Root是linux权限最大的用户,可以执行一切操作 Linux使用简介
  • 8. Linux使用简介Shell shell不但是Linux命令解析器,而且是全功能的编程环境(脚本编程)。 第一个真正的 Unix shell -- 'sh',亦称为'Bourne shell',诞生于 1975 年,作者是 Steve Bourne 。 BASH - the GNU Bourne-Again Shell (有点玩笑的味道……)。RedHat Linux现在标配的Shell Shell编程 shell脚本:bash脚本,perl,python等
  • 9. Linux使用简介 Linux基本操作命令Linux基本操作命令 1. man 对你熟悉或不熟悉的命令提供帮助解释 eg:man ls 就可以查看ls相关的用法 注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行。 2. ls 查看目录或者文件的属*,列举出任一目录下面的文件 eg: ls /usr/man ls -l a.d表示目录(directory),如果是一个"-"表示是文件,如果是l则表示是一个连接文件(link) b.表示文件或者目录许可权限.分别用可读(r),可写(w),可运行(x)。 3. cp 拷贝文件 eg: cp filename1 filename2 //把filename1拷贝成filename2 cp 1.c netseek/2.c //将1.c拷到netseek目录下命名为2.c
  • 10. Linux使用简介 Linux基本操作命令4. rm 删除文件和目录 eg: rm 1.c //将1.c这个文件删除 5. mv 移走目录或者改文件名 eg: mv filename1 filename2 //将filename1 改名为filename2 mv qib.tgz ../qib.tgz //移到上一级目录 6. cd 改变当前目录 pwd 查看当前所在目录完整路径 eg: pwd //查看当前所在目录路径 cd netseek //进入netseek这个目录 cd //退出当前目录 7. cat,more命令 将某个文件的内容显示出来。两个命令所不同的是:cat把文件内容一直打印出来,而 more则分屏显示 eg; cat>1.c //就可以把代码粘帖到1.c文件里,按ctrl+d 保存代码。 cat 1.c 或more 1.c //都可以查看里面的内容。 gcc -o 1 1.c //将1.c编译成.exe文件,我们可以用此命编译出代码。
  • 11. Linux使用简介 Linux基本操作命令8.chmod 命令 权限修改 用法:chmod 一位8进制数 filename。 eg: chmod u+x filenmame //只想给自己运行,别人只能读 //u表示文件主人, g 表示文件文件所在组。 o 表示其他人 ;r 表可读,w 表可写,x 表可以运行 chmod g+x filename //同组的人来执行 9. clear,date命令 clear:清屏,相当与DOS下的cls;date:显示当前时间。 10. mount 加载一个硬件设备 用法:mount [参数] 要加载的设备 载入点 eg: mount /dev/cdrom cd /mnt/cdrom //进入光盘目录 11. su 在不退出登陆的情况下,切换到另外一个人的身份 用法: su -l 用户名(如果用户名缺省,则切换到root状态) eg:su -l netseek (切换到netseek这个用户,将提示输入密码)
  • 12. Linux使用简介 Linux基本操作命令12.whoami,whereis,which,id //whoami:确认自己身份 //whereis:查询命令所在目录以及帮助文档所在目录 //which:查询该命令所在目录(类似whereis) //id:打印出自己的UID以及GID。(UID:用户身份唯一标识。GID:用户组身份唯一标识。每一个用户只能有一个唯一的UID和 GID) eg: whoami //显示你自已登陆的用户名 whereis bin 显示bin所在的目录,将显示为:/usr/local/bin which bin 13. grep,find grep:文本内容搜索;find:文件或者目录名以及权限属主等匹配搜索 eg: grep success *    /*查找当前目录下面所有文件里面含有success字符的文件
  • 13. Linux使用简介 Linux基本操作命令14. kill 可以杀死某个正在进行或者已经是dest状态的进程 eg; ps ax 15. passwd 可以设置口令 16. history 用户用过的命令 eg: history //可以显示用户过去使用的命令 17. !! 执行最近一次的命令 18. mkdir命令 eg: mkdir netseek //创建netseek这个目录 19. tar 解压命令 eg: tar -zxvf nmap-3.45.tgz //将这个解压到nmap-3.45这个目录里 20. finger 可以让使用者查询一些其他使用者的资料 eg: finger //查看所用用户的使用资料
  • 14. Linux驱动程序简介Linux启动过程 RedHat典型启动过程-当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。
  • 15. Linux驱动程序简介Linux启动过程
  • 16. Linux驱动程序简介嵌入式Linux引导程序 嵌入式Linux很少使用像lilo,grub这类引导程序,嵌入式领域使用较多的是u-boot U-boot介绍 U-boot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从http://sourceforge.net/projects/u-boot下载 U-boot是由PPCBOOT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案。u-boot是一个open source的bootloader,目前版本是1.1.6。u-boot是在ppcboot以及armboot的基础上发展而来,目前发展得相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。 U-boot支持NFS网络文件系统和ELF格式的文件直接启动Linux,也能对Linux Image进行压缩后存储,启动的时候再解压到内存运行。
  • 17. Linux驱动程序简介Linux设备类型 Unix系统将设备分为三类:字符设备、块设备、网络接口,所以模块也分三类:字符模块、块模块、网络模块 字符设备 字符设备驱动通常至少实现:open,close,read和write系统调用。与普通文件区别在于大部分字符设备只能顺序访问数据通道。 [root@localhost ~]# ls /dev/ttyS* -l crw-rw---- 1 root uucp 4, 64 2008-11-26 08:56 /dev/ttyS0 crw-rw---- 1 root uucp 4, 65 2008-11-26 08:56 /dev/ttyS1 关于TTY:一个 tty 设备得名于电传打字机的很老的简称, 并且起初只和连接到一台 UNIX 机器的物理或者虚拟终端有关联. 长时间以来, 这个名子还逐渐表示任何串口类型的设备, 因为终端连接也能够在这样的一个连接上建立. 一些物理 tty 设备的例子是串口, USB-串口 转换器, 以及某些类型的需要特殊处理来正确工作的调制解调器(例如传统的 Win-Modem 类型设备). tty 虚拟设备支持虚拟控制台以用来登录到一台计算机, 或者从键盘, 或者从网络连接, 或者通过一个 xterm 会话.
  • 18. Linux驱动程序简介Linux设备类型 块设备 块驱动程序,除了给内核提供和字符驱动一样的接口外,还提供了专门面向块设备的接口,块设备的接口必须支持挂装(mount)文件系统。 [root@localhost ~]# ls /dev/sda* -l brw-r----- 1 root disk 8, 0 2008-11-26 08:56 /dev/sda brw-r----- 1 root disk 8, 1 2008-11-26 08:56 /dev/sda1 brw-r----- 1 root disk 8, 2 2008-11-26 08:56 /dev/sda2 网络设备 网络接口由内核中的网络子系统驱动,负责发送和接收数据包。网络接口在文件系统中没有对应接点项,而是分配一个唯一的名字(eth0 eth1...ethn)。
  • 19. Linux驱动程序简介Linux module module(模块)是 Linux 的一大革新。有了 module 之后,写 device driver (设备驱动程序)不再是一项恶梦,修改 kernel 也不再是一件痛苦的事了。因为你不需要每次要测试 driver 就重新编译kernel 一次。那简直是会累死人。Module 可以允许我们动态的改变 kernel,加载 device driver,或者卸载device driver,而不需要重启或者重新编译系统,它也能缩短我们 driver development 的时间。 Module操作 insmod - 加载模块 lsmod - 查看系统已经加载的模块 rmmod - 删除模块
  • 20. Linux程序设计Linux编程语言 最早的Linux是用汇编实现的,现在已经支持非常多的程序语言,但我们在Linux下编程用得最多的还是标准C语言
  • 21. Linux程序设计Linux程序 Linux应用程序表现为2中形式:可执行文件和脚本 可执行文件 类似于windows平台的.exe文件 可执行文件的3种格式(包括Unix平台):a.out,coff,elf a.out - assembler and link editor output 汇编器和链接编辑器的输出 a.out 是早期UNIX系统使用的可执行文件格式,由 AT&T 设计,现在基本上已被 ELF 文件格式代替。a.out 的设计比较简单,但其设计思想明显的被后续的可执行文件格式所继承和发扬。 a.out 文件包含 7 个 section,格式如下: exec header(执行头部,也可理解为文件头部) text segment(文本段) data segment(数据段) text relocations(文本重定位段) data relocations(数据重定位段) symbol table(符号表) string table(字符串表)
  • 22. Linux程序设计Linux程序 coff - Common Object File Format 通用对象文件格式 COFF 格式比 a.out 格式要复杂一些,最重要的是包含一个节段表(section table),因此除了 .text,.data,和 .bss 区段以外,还可以包含其它的区段。另外也多了一个可选的头部,不同的操作系统可一对此头部做特定的定义。 COFF 文件格式如下: File Header(文件头部) Optional Header(可选文件头部) Section 1 Header(节头部) ……… Section n Header(节头部) Raw Data for Section 1(节数据) Raw Data for Section n(节数据) Relocation Info for Sect. 1(节重定位数据) Relocation Info for Sect. n(节重定位数据) Line Numbers for Sect. 1(节行号数据) Line Numbers for Sect. n(节行号数据) Symbol table(符号表) String table(字符串表)
  • 23. Linux程序设计Linux程序 elf - Executable and Linking Format 可执行和链接格式 elf文件有三种类型:可重定位文件:也就是通常称的目标文件,后缀为.o;共享文件:也就是通常称的库文件,后缀为.so;可执行文件; elf可执行文件 -对一个ELF可执行程序而言,一个基本的段是标记p_type为 PT_INTERP的段,它表明了运行此程序所需要的程序解释器(/lib/ld- linux.so.2),实际上也就是动态连接器(dynamic linker)。最重要的 段是标记p_type为PT_LOAD的段,它表明了为运行程序而需要加载到 内存的数据。
  • 24. Linux程序设计Elf文件头 Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x80483cc Start of program headers: 52 (bytes into file) Start of section headers: 14936 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 6 Size of section headers: 40 (bytes) Number of section headers: 34 Section header string table index: 31
  • 25. Linux程序设计编译器 C语言的编译器历史上被简称为cc Linux C语言编译器使用GNU 的C编译器,简称gcc,支持ANSI C的标准语法 http://www.gnu.org gnu所有发布project均能找到 第一个Linux C程序 第一个C编写的helloworld #include #include int main() { printf(“Hello world!\n”); exit(0); }
  • 26. Linux程序设计第一个Linux C程序 第一个C程序的编译 [root@localhost ~]gcc -o hello helloworld.c 第一个C程序的执行 [root@localhost ~]./hello Hello world! GCC常用的编译选项 -c 只进行预处理、编译和汇编,生成.o文件 -S 只进行预处理和编译,生成.s文件,是汇编源代码,熟悉汇编语言的可以通过读它来解决莫名其妙的问题 -E 只进行预处理,这会产生预处理后的结果到标准输出,可以通过重定向保存,这个在查找预定义产生的错误时可能有用 -C 预处理时不删除注释信息,这在-E时可能有用
  • 27. Linux程序设计GCC常用的编译选项 -o 指定目标名称,在使用-c、-S参数时可用,没有这两个参数以及-E参数时指定最终可执行文件的名称,缺省是a.out -include file 功能同代码中的#include,个人更习惯使用#include,只有在忘记#include,调试编译时偶尔偷懒 -Dmacro[=defval] 定义一个宏,相当于代码中的#define macro [defval] -Umacro 取消宏的定义,相当于代码中的#undef macro -undef 取消对任何非标准宏的定义 -Idir 先在dir目录中查找include的头文件 -lname 链接libname.so的库来编译程序 -Ldir 指定编译的时候搜索库的路径,与-I功能类似,但是是定义用来搜索.so的路径 -O[0-3] 编译器优化,数字越大,优化级别越高,0没有优化 -g 编译器编译时加入debug信息,便于gdb,valgrind等工具使用,关于valgrind的使用请参考另一篇 [使用valgrind来管理cpp程序的内存] -pg 编译器加入信息给gprof使用[使用gprof来优化cpp程序] -share 使用动态库 -static 禁止使用动态库
  • 28. Linux程序设计GNU make make在执行时,需要一个命名为Makefile的文件。这个文件告诉make以何种方式编译源代码和链接程序。典型地,可执行文件可由一些.o文件按照一定的顺序生成或者更新。如果在你的工程中已经存在一个或者多个正确的Makefile。当对工程中的若干源文件修改以后,需要根据修改来更新可执行文件或者库文件,正如前面提到的你只需要在shell下执行“make”。make会自动根据修改情况完成源文件的对应.o文件的更新、库文件的更新、最终的可执行程序的更新。make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。对需要更新的文件make就执行数据库中所记录的相应命令(在make读取Makefile以后会建立一个编译过程的描述数据库。此数据库中记录了所有各个文件之间的相互关系,以及它们的关系描述)来重建它,对于不需要重建的文件make什么也不做。而且可以通过make的命令行选项来指定需要重新编译的文件。 推荐文章http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-02.html
  • 29. Linux程序设计文件 和Unix一样,linux系统的文件具有特别重要的意义,因为它为操作系统服务和设备提供了一个统一而简单的接口,在Linux中一切对象都是文件。Linux应用程序完全可以像使用文件一样使用串行口、打印机和其他设备。 文件和设备 linux下目录和硬件设备都被当作文件,如CDROM,可以被挂载为一个目录,然后对该目录下的文件进行操作。 #mount –t iso9660 /dev/hdc /mnt/cdrom 这个命令将cdrom设备挂载到/mnt/cdrom目录下 /dev/console 这设备代表系统控制台,所有系统的错误信息或者诊断信息都被送往该设备(终端或显示屏)
  • 30. Linux程序设计文件 /dev/tty 如果一个进程有控制终端,特殊文件tty就是这个控制终端(键盘和显示屏,键盘和某个窗口)的别名(逻辑设备)。 /dev/null 空设备,所有写到该设备的信息都会被丢弃,读直接返回文件尾标志。人们通常把不需要的输出重定向到该设备。 对于文件的操作,大部分时间你只需要做open,close,read,write,ioctl这5个操作。我们使用很少量的函数就可以对设备进行控制和访问,这些函数被称做系统调用,有linux直接提供,是应用程序通向操作系统内核的接口。操作系统的核心就是一组设备驱动程序,这是一些对系统硬件进行控制的底层函数。
  • 31. Linux程序设计内核空间和用户空间 Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。 Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。
  • 32. Linux程序设计进程 程序和进程,程序是为了完成某种任务而设计的软件,比如OpenOffice是程序。什么是进程呢?进程就是运行中的程序。一个运行着的程序,可能有多个进程。 比如 LinuxSir.Org 所用的WWW服务器是apache服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户来同时请求httpd服务,apache服务器将会创建有多个httpd进程来对其进行服务。 创建,在Linux下产生新的进程的系统调用就是fork函数,这个函数名是英文中"分叉"的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就"分叉"了,所以这个名字取得很形象。fork系统调用产生一个新的进程, 叫子进程, 调用进程叫父进程. 在Linux网络编程中经常用到fork()系统调用。例如一个客户机/Web服务器构建的网络环境中,Web服务器往往可以满足许多客户端的请求。如果一个客户机如果需要访问Web服务器需要发送一个请求,此时由服务器生成一个父进程,然后父进程通过fork()系统调用产生一个子进程,此时客户机的请求由子进程完成。父进程可以再度回到等待状态不断服务其他用户端。
  • 33. Linux程序设计进程 进程的属性 进程ID(PID):是唯一的数值,用来区分进程; 父进程和父进程的ID(PPID); 启动进程的用户ID(UID)和所归属的组(GID); 进程状态:状态分为运行R、休眠S、已死亡的进程(Zombie)Z等; 进程执行的优先级; 进程所连接的终端名; 进程资源占用:比如占用资源大小(内存、CPU占用量); 进程状态 执行(Running)状态:CPU正在执行,即进程正在占用CPU。 就绪(Waiting)状态:进程已经具备的执行的一切条件,正在等待分配CPU的 处理时间片。 停止(Stoped)状态:进程不能使用CPU。 Zombie:这是由于某些原因被终止的进程,但是在task数据中仍然保留 task_struct结构。 它象一个已经死亡的进程。
  • 34. Linux程序设计进程管理 ps命令,显示进程状态 [root@localhost ~]# ps -A PID TTY TIME CMD 1 ? 00:00:00 init 2 ? 00:00:00 migration/0 3 ? 00:00:00 ksoftirqd/0 4 ? 00:00:00 watchdog/0 5 ? 00:00:00 events/0 6 ? 00:00:00 khelper 7 ? 00:00:00 kthread 46 ? 00:00:00 kblockd/0 kill命令,结束进程 top命令,linux下性能分析工具,可实时显示各个进程的资源状况,类似于windows任务管理器
  • 35. Linux程序设计进程间通信 Linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数); (BSD:是Unix的衍生系统,常被当作工作站级别的 Unix 系统)
  • 36. Linux程序设计进程间通信 消息队列(Message Queue):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 共享内存(Share Memory):使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。 (IPC:Inter-Process Communication进程间通信)
  • 37. Linux程序设计进程间通信 信号量(Semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
  • 38. Linux程序设计POSIX线程 线程类似于进程。如同进程,线程由内核按时间分片进行管理。在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同。而在多处理器系统中,如同多个进程,线程实际上一样可以并发执行。那么为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间。不同的线程可以存取内存中的同一个变量。所以,程序中的所有线程都可以读或写声明过的全局变量。 POSIX是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。主要是为了提高程序的可移植性。
  • 39. Linux程序设计Socket 什么是socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
  • 40. Linux程序设计Socket socket类型 常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据 报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
  • 41. Linux程序设计Socket Socket建立   为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:    int socket(int domain, int type, int protocol);     domain指明所使用的协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值"0"。 Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。    Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。   两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址(IP地址)、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。
  • 42. Linux程序设计Socket Socket配置   通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过 调用connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用 bind函数来配置本地信息。 Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。Bind函数原型为:    int bind(int sockfd,struct sockaddr *my_addr, int addrlen);
  • 43. Linux程序设计Socket int bind(int sockfd,struct sockaddr *my_addr, int addrlen); Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。    struct sockaddr结构类型是用来保存socket信息的:    struct sockaddr {    unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data[14]; /* 14 字节的协议地址 */ };    sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。    另外还有一种结构类型:    struct sockaddr_in {    short int sin_family; /* 地址族 */    unsigned short int sin_port; /* 端口号 */    struct in_addr sin_addr; /* IP地址 */    unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */    };
  • 44. Linux程序设计Socket 建立连接 面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:    int connect(int sockfd, struct sockaddr *serv_addr,int addrlen); Sockfd 是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地质结构的长度。 Connect函数在出现错误时返回-1,并且设置errno为相应的错误码。进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器 的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到 打断口。    Connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。
  • 45. Linux程序设计Socket 建立连接 Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。    int listen(int sockfd, int backlog); Sockfd 是Socket系统调用返回的socket 描述符;backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们。Backlog对队列中等待 服务的请求的数目进行了限制,大多数系统缺省值为20。如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。 当出现错误时listen函数返回-1,并置相应的errno错误码。
  • 46. Linux程序设计Socket 建立连接 accept()函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。    int accept(int sockfd, void *addr, int *addrlen);     sockfd是被监听的socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息(某 台主机从某个端口发出该请求);addrten通常为一个指向值为sizeof(struct sockaddr_in)的整型指针变量。出现错误时accept函数返回-1并置相应的errno值。   首先,当accept函数监视的 socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的 初始socket仍可以继续在以前的 socket上监听,同时可以在新的socket描述符上进行数据传输操作。
  • 47. Linux程序设计Socket 数据传送 Send()和recv()这两个函数用于面向连接的socket上进行数据传输。   Send()函数原型为:   int send(int sockfd, const void *msg, int len, int flags); Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。    Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。 recv()函数原型为:    int recv(int sockfd,void *buf,int len,unsigned int flags);    Sockfd是接受数据的socket描述符;buf 是存放接收数据的缓冲区;len是缓冲的长度。Flags也被置为0。Recv()返回实际上接收的字节数,当出现错误时,返回-1并置相应的errno值。
  • 48. Linux程序设计Socket 数据传送 sendto()和recvfrom()用于在无连接的数据报socket方式下进行数据传输。由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址。 sendto()函数原型为:    int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);    该函数比send()函数多了两个参数,to表示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof (struct sockaddr)。Sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。    recvfrom()函数原型为:    int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);     from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen常置为sizeof (struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或 当出现错误时返回-1,并置相应的errno。 如果你对数据报socket调用了connect()函数时,你也可以利用send()和recv()进行数据传输,但该socket仍然是数据报socket,并且利用传输层的UDP服务。但在发送或接收数据报时,内核会自动为之加上目地和源地址信息。
  • 49. Linux程序设计Socket 结束传输 close(socketfd)
  • 50. Linux程序设计GDB调试 准备,在编译的时候一定要加-g调试选项 启动,shell命令行输入gdb xxx,xxx是你要调试的应用程序 常用命令 file 装入想要调试的可执行文件. kill 终止正在调试的程序. list 列出产生执行文件的源代码的一部分. next 执行一行源代码但不进入函数内部. step 执行一行源代码而且进入函数内部. run 执行当前被调试的程序 quit 终止 gdb watch 使你能监视一个变量的值而不管它何时被改变. break 在代码里设置断点, 这将使程序执行到这里时被挂起. make 使你能不退出 gdb 就可以重新产生可执行文件. shell 使你能不离开 gdb 就执行 UNIX shell 命令.
  • 51. Linux程序设计其他知识 shell程序设计 Linux的环境(环境变量、时间日期、临时文件、用户信息、主机信息、日志等) Linux的终端 数据管理(内存分配、空指针、数据库等) 图形界面开发应用(GTK、QT、GNOME等) 设备驱动程序 推荐两本书 《Linux设备驱动程序(第三版)》o’reilly下载见 http://www.linuxidc.com/Linux/2011-09/43991.htm 《Linux程序设计(第三/四版)》下载见 http://www.linuxidc.com/Linux/2011-08/41135.htm
  • 52. 谢谢!