- 博客(35)
- 资源 (55)
- 收藏
- 关注
原创 linux网络编程之TCP/IP基础(五):分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式:相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度。下面分析一帧基于UDP的TFTP协议帧:以太网首部0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00 IP首部0000: 45 000010: 00 53 93 25 00 00
2013-05-24 11:16:01 5671
原创 linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
一、TCP段格式:TCP的段格式如下图所示源端口号与目的端口号源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接。序号序号表示在这个报文段中的第一个数据字节序号。确认号仅当ACK标志为1时有效。确认号表示期望收到的下一个字节的序号。头部长度4位,TCP头部最多60个字节,最少20个字节保留位6位
2013-05-23 22:02:41 7474 2
原创 linux网络编程之TCP/IP基础(三):IP数据报格式和IP地址路由
一、IP数据报格式IP数据报格式如下:版本IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6首部长度以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP首部20个字节;最大值为15,所以首部长度最大为60个字节服务类型(TOS)长度为8位。此字段包含3位的优先权(现已忽略),4位的服务类型子字段和1位的保留位(必须置
2013-05-23 12:27:00 7405 3
原创 linux网络编程之TCP/IP基础(二):利用ARP和ICMP协议解释ping命令
一、MTU以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要进行分片(Fragmentation),把数据报分成若干片,这样每一片都小于MTU。当网络上的两台主机互相进行通信时,两台
2013-05-22 21:39:17 13109 6
原创 linux网络编程之TCP/IP基础(一):TCP/IP协议栈与数据报封装
一、ISO/OSI参考模型OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardization)国际标准化组织定义的网络分层模型,共七层,如下图。物理层(Physical Layer):物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数
2013-05-21 20:57:18 17288 8
原创 linux系统编程之管道(三):命名管道FIFO和mkfifo函数
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的。如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通信呢?内核提供一条通道不成问题,问题是如何标识这条通道才能使各进程都可以访问它?文件系统中的路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道。FIFO
2013-05-21 11:03:53 38380 4
原创 linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
一、当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。示例程序如下: C++ Code 123456789101112131415161
2013-05-21 09:39:15 9466 1
原创 linux系统编程之基础必备(七):read/write函数与(非)阻塞I/O的概念
一、read/write 函数read函数从打开的设备或文件中读取数据。#include ssize_t read(int fd, void *buf, size_t count);返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中
2013-05-20 16:40:34 16164 4
原创 linux系统编程之管道(一):匿名管道和pipe函数
一、进程间通信每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。如下图所示。二、管道是一种最基本的IPC机制,由pipe函
2013-05-20 15:53:51 11639 5
原创 linux系统编程之信号(六):竞态条件与sigsuspend函数
一、利用pause和alarm函数实现sleep函数#include int pause(void);pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR,所以p
2013-05-20 12:43:20 4377 1
原创 linux系统编程之基础必备(六):可重入函数、线程安全、volatile
一、 POSIX 中对可重入和线程安全这两个概念的定义: Reentrant Function:A function whose effect, when called by two or more threads,is guaranteed to be as if the threads each executed the function one after anothe
2013-05-20 09:40:06 5216 2
原创 linux系统编程之信号(五):实时信号与sigqueue函数
一、sigqueue函数功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。原型:int sigqueue(pid_t pid, int sig, const union sigval value);参数: sigqueue的第一个参数是指定接收信号的进程id,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构unio
2013-05-19 13:04:02 10080 1
原创 linux系统编程之信号(四):信号的捕捉与sigaction函数
一、内核如何实现信号的捕捉如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下:1. 用户程序注册了SIGQUIT信号的处理函数sighandler。2. 当前正在执行main函数,这时发生中断或异常切换到内核态。3. 在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT
2013-05-19 11:30:36 21461 5
原创 linux系统编程之信号(三):信号的阻塞与未决
一、信号在内核中的表示实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的:
2013-05-18 21:52:58 8899 9
原创 linux系统编程之信号(二):一些信号发送函数和不同精度的睡眠
一、kill, raise, killpg 函数int kill(pid_t pid, int sig);int raise(int sig);int killpg(int pgrp, int sig);kill命令是调用kill函数实现的,kill函数可以给一个指定的进程或进程组发送指定的信号,其中kill 函数的pid 参数取值不同表示不
2013-05-18 19:46:09 4110
原创 linux系统编程之信号(一):信号基本概述
一、为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程。2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。3. 如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断。4. 终端驱动程序将Ctrl-C解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一个SIGINT信
2013-05-17 18:38:32 5760 1
原创 linux系统编程之进程(五):终端、作业控制与守护进程
一、终端的概念在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是
2013-05-15 20:54:31 6392 4
原创 linux系统编程之进程(四):wait/waitpid函数与僵尸进程、fork 2 times
一、僵尸进程当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止)子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。父进程查询子进程的退出状态可以用wait/waitpid函数。二、如何避免僵尸进程当一个子进程结束运行时,它
2013-05-15 19:41:47 6237 1
原创 linux系统编程之进程(三):exec系列函数和system函数
一、exec替换进程映象在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。二、exec关联函数组包含头文件功能用exec函数可以把当前进程替换为一个新进程。exec
2013-05-15 16:26:59 5509 6
原创 linux系统编程之进程(二):fork函数相关总结
一、fork系统调用包含头文件 和 函数功能:创建一个子进程函数原型 pid_t fork(void);参数:无参数。返回值:如果成功创建一个子进程,对于父进程来说返回子进程ID如果成功创建一个子进程,对于子进程来说返回值为0如果为-1表示创建失败(1)、使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进
2013-05-15 09:15:53 6887 1
原创 linux系统编程之文件与I/O(五):文件的内核结构file和dup实现重定向
一、打开文件内核数据结构1、一个进程打开两个文件文件状态标志:读、写、追加、同步、非阻塞等2、一个进程两次打开同一文件3、两个进程打开同一文件示例程序: C++ Code 1234567891011121314151617181
2013-05-14 16:51:48 11418 1
原创 linux系统编程之进程(一):进程基本概述
一、什么是进程从用户的角度来看进程是程序的一次执行过程。从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。进程是资源分配的最小单位。每一个进程都有自己独立的地址空间与执行状态。像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程。二、进程数据结构进程的静态描述:由三部分组成:PCB、有关程序段和
2013-05-14 13:07:00 3435
原创 linux系统编程之文件与I/O(六):fcntl 函数与文件锁
一、fcntl函数功能:操纵文件描述符,改变已打开的文件的属性int fcntl(int fd, int cmd, ... /* arg */ );cmd的取值可以如下:复制文件描述符F_DUPFD (long)设置/获取文件描述符标志F_GETFD (void)F_SETFD (long)设置/获取文件状态标志F_GETFL (vo
2013-05-14 11:26:59 14855 3
原创 linux系统编程之文件与I/O(四):文件的属性
一、读取文件元数据int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf); stat() stats the file pointed to by path and fill
2013-05-13 16:10:27 3493
原创 linux系统编程之文件与I/O(三):目录的操作
一、目录的访问功能说明:打开一个目录原型:DIR* opendir(char *pathname);返回值:打开成功,返回一个目录指针打开失败,则返回NULL功能说明:访问指定目录中下一个连接的细节原型:struct dirent* readdir(DIR *dirptr);返回值:返回一个指向dirent结构的指针,它包含指定目录中
2013-05-12 22:41:20 2944 2
原创 linux系统编程之文件与I/O(二):文件的读取写入
一、read系统调用一旦有了与一个打开文件描述相关连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型:ssize_t read(int fd, void *buf, size_t count);参数:fd :想要读的文件的文件描述符buf : 指向内存块的指针,从文件中读取来的字节放到这个内存
2013-05-12 21:45:07 3845
原创 linux系统编程之文件与I/O(一):文件的打开关闭
一、文件描述符对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体)。一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2
2013-05-12 20:12:08 4395 3
原创 linux系统编程之基础必备(五):Linux进程地址空间和虚拟内存
一、虚拟内存先来看一张图(来自《Linux内核完全剖析》),如下:分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读、可写和可执行)一个段时,当前特权级CPL就会与段的特权级进行比较,以确定是否有权限访问。每个特权级都有自己的程序栈,当程序从一个特权级切换到另
2013-05-12 16:46:20 7535
原创 算法:二叉排序树的删除节点策略及其图形化(二叉树查找)
二叉排序树(BST,Binary Sort Tree)具有这样的性质:对于二叉树中的任意节点,如果它有左子树或右子树,则该节点的数据成员大于左子树所有节点的数据成员,且小于右子树所有节点的数据成员。排序二叉树的中序遍历结果是从小到大排列的。二叉排序树的查找和插入比较好理解,主要来看一下删除时的情况。如果需要查找并删除如图8-6-8中的37, 51, 73,93这些在二叉排序树中是叶子的结点
2013-05-05 23:06:03 12218
原创 算法:静态查找表(Static Search Table)(顺序查找、二分查找、插值查找、斐波纳契查找)
查找表(Search table)是由同一类型的数据元素(或记录)构成的集合。关键字(key)是数据元素中某个数据项的值,又称为键值,用它可以表示一个数据元素,也可以标识一个记录的数据项(字段),称之为关键码。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字(primary key)。而对于那些可以识别多个数据元素(或记录)的关键字,称为次关键字(Secondary Key),次关键字也可
2013-05-03 20:57:56 7121 12
原创 算法:求解AOE网的关键路径
前面我们简要地介绍了AOE网和关键路径的一些概念,本文接着对求解关键路径程序的主要函数进行分析。现有一AOE网图如图7-9-4所示,我们使用邻接表存储结构,注意与拓扑排序时邻接表结构不同的地方在于,这里弧表结点增加了weight域,用来存储弧的权值。求解事件的最早发生时间etv的过程,就是我们从头至尾找拓扑序列的过程,因此在求关键路径之前,需要先调用一次拓扑序列算法的代码来计算etv
2013-05-02 20:35:03 11886
原创 算法:AOE网(Activity On edge Network)与关键路径简介
前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题。如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程,这个流程的时间就是最短时间。在前面讲了AOV网的基础上,来介绍一个新的概念。在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的
2013-05-02 20:34:06 12329 1
原创 算法:AOV网(Activity on Vextex Network)与拓扑排序
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex Network)。AOV网中的弧表示活动之间存在的某种制约关系,AOV网中不能存在回路,让某个活动的开始要以自己完成作为先决条件,显然是不可以的。设G= { V, E }是一个具有n个顶点的有向图,V中的顶点序列v1, v2, ...,
2013-05-01 21:49:24 8391
原创 算法:最短路径之弗洛伊德(Floyd)算法
为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例。图7-7-12的左图是一个简单的3个顶点的连通网图。我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点的最短路径权值和的矩阵。P代表对应顶点的最短路径的前驱矩阵。在未分析任何顶点之前,我们将D命名为D(-1),其实它就是初始图的邻接矩阵。将P命名为P(-1), 初始化为图中的矩阵。首先我
2013-05-01 18:53:58 23299 3
原创 算法:最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法。本文先来讲第一种,从某个源点到其余各顶点的最短路径问题。这是一个按路径长度递增的次序产生最短路径的算法,它的大致思路是这样的。比如说要求图7-7-3中顶点v0到v1的最短路径,显然就是
2013-05-01 13:32:14 11710 3
《单片机C语言程序设计实训100例基于8051+Proteus仿真》源代码
2011-08-16
NI Circuit Design Suite 11.0(Multisim 11.0)pro fulll(full版)注册机
2011-08-15
NI Circuit Design Suite 11.0(Multisim 11.0)educational(教育版)注册机
2011-08-15
NI Circuit Design Suite 11.0(Multisim 11.0)Internal(内部版)注册机
2011-08-15
Crack_dsp_builder_11.0
2013-05-01
Windows6.1-KB917607-x86 (32bit)
2011-08-15
系统程序员成长计划 PDF
2011-08-15
PROTEUS VSM help
2011-08-15
耦合多工器综合软件 带例程与帮助文档
2011-08-15
分形电容 英文论文三篇
2011-08-15
cst+2010+crack
2011-08-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人