08 2012 档案
摘要:一.信号量(同步)1.回顾:一个进程控制另外一个进程.逻辑变量+pause/sleep+信号2.信号量(semaphore)信号灯三个数据:红灯/绿灯/黄灯60 90 10信号量是共享内存整数数组.根据需要定义指定的数组长度信号量就是根据数组中的值,决定阻塞还是解除阻塞3.编程3.1.创建或者得到信号量semget3.2.初始化信号量中指定下标的值semctl3.3.根据信号量阻塞或者解除阻塞semop3.4.删除信号量semctl案例:A:B创建信号量 得到信号量初始化信号量根据信号量阻塞解除阻塞删除信号量semget函数说明int semget(key_t key, int ...
阅读全文
摘要:一.基于文件的通信1.普通文件(io/mmap)2.有名管道文件3.匿名管道4.Socket二.基于内存的通信0.一组内核内存的工具ipcs ipcs -mipcs -qipcs -sipcrm -q 编号ID1.普通的父子进程之间的匿名内存共享映射2.内核共享内存编程模型2.1.创建共享内存,得到一个ID shmget2.2.把ID影射成虚拟地址(挂载) shmat2.3.使用虚拟地址访问内核共享内存 使用任何内存函数与运算符号2.4.卸载虚拟地址 shmdt2.5.删除共享内存 shctl(修改/获取共享内存的属性) 共享内存的属性案例:A.创建共享内存,并且修改内存数据。1.创建共享内存
阅读全文
摘要:回顾:1.信号的作用2.理解信号:软中断可靠与不可靠信号kill -l3.信号发送与注册kill/raise alarm setitimer signal4.信号的屏蔽sigprocmasksigemptyset sigfillset ...5.信号屏蔽的切换sigpendingsigsuspend=pause+ 指定屏蔽信号pause与sigsuspend都回被信号中断.中断的是pause与sigsuspen,不是进程中其他代码sigsuspend放在sigprocmask环境中思考:5.1.sigsuspend是否影响sigprocmask屏蔽的信号呢?影响.使原来的屏蔽信号全部失效.当s
阅读全文
摘要:问题解答:1.exit(状态码)返回状态码有什么意义?返回值被系统得到.系统根据状态码进行日志记录.返回值被调用者得到:system/wait.程序会根据返回状态码进行对应处理。exit(状态码)=main函数中的return 状态码;2.状态码的第二个字节才是exit()的返回值或者return值。一.进程的基本控制1.进程的常见控制函数1.1.为什么需要控制进程?1.2.pause/sleep/usleep1.3.atexit on_exitView Code #include <stdio.h>#include <stdlib.h> void fun(){ pri
阅读全文
摘要:一.IO与文件目录管理1.pread=lseek+readpread读取以后不改变读写位置2.mmap映射:/proc/${pid}/mem 无法映射3.IO的有效用户与实际用户默认情况:实际用户与有效用户一致。实际用户:执行用户有效用户:权限用户uid_t getuid()uid_t geteuid()View Code #include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>main(){ int fd
阅读全文
摘要:一.IO与文件映射1.IO的共享与效率read与write其中数据缓冲的大小读取数据的缓冲大小:getpagesize。2.定位与定位读取(随机读取)read与write在操作的时候,自动移动读取位置.lseek改变读取位置.pread/pwrite在指定位置读写。2.1.lseek的函数说明: off_t lseek( int fd,//定位文件描述符号 off_t off,//定位位置 int whence//定位参照点:文件开始位置/文件结束...
阅读全文
摘要:一、make与makefile1.回顾:目标的语法目标名:依赖目标@命令@命令make的命令行使用make -f make脚本文件 目标名2.目标的划分目标依赖3.默认规则:a.不指定目标,执行第一个目标b.不指定make文件,默认文件是makefile Makefilemakefile优先4.目标的调用规则:(make把目标当作文件)make执行目标:搜索与目标相同的文件如果文件存在,则判定日期。日期最新,则停止执行,输出提示日期不是最新,则进行执行。比较:当前目标与依赖目标5.建议:只要有文件输出,就把任务作为一个目标,并且把输出的文件作为目标名。6.潜规则(不建议).c目标与.o目标。查
阅读全文
摘要:一 线程局部存储 Thread Local Storage 1 由于多个线程使用同一个变量,各个线程 都对变量进行操作,那么变量的值会被不同 线程操作覆盖。 通常 变量A <-- 线程A <-- 线程B TLS 变量A <-- 线程A 变量A <-- 线程B 2 TLS的使用 2.1 使用关键字 __declspec(thread) __declspec(thread) CHAR * g_pszText2 = NULL; 2.2 TLS相关API 2.2.1 创建TLS索引 DWORD TlsAlloc(VOID) 返回一个TLS索引号 2.2.2 设置值 BOOL T
阅读全文
摘要:一 Windows进程1 Windows进程 进程是一个容器,包含了一个应用程序实例的各种资源。Windows多任务的操作系统,因此可以同时执行多个进程。 2 Windows进程的一些特点 2.1 进程中包含了执行代码等资源。 2.2 进程都具有私有的地址空间。 2.3 每个进程都有一个ID,标识进程。 2.4 每个进程都有自己的安全属性 2.5 至少要包含一个可以执行的线程。 二 进程的环境 1 环境信息的获取 获取: LPVOID GetEnvironmentStrings(VOID) 返回值是获取到的所有环境信息 释放: BOOL FreeEnvironmentStrings( ...
阅读全文
摘要:Windows的内存管理一 地址空间 1 地址空间 一个程序最大的寻址范围。对于Win32操作系统最大的寻址范围是2的32次方,0-0xFFFFFFFF。这个寻址范围由CPU决定。CPU的寻址范围越大,编程难度降低。 2 地址空间的划分 通常情况下: 2.1 用户空间 地址范围 0 - 0x7FFFFFFF(2G),运行应用程序代码、数据等等。 2.2.1 空指针区(NULL区) 地址范围 0 - 0x0000FFFF 2.2.2 用户区 地址范围 0x00010000 - 0x7FFEFFFF 2.2.3 64K禁入区 地址范围 0x7FFEFFFF - 0x7FFFFFFF 2.2 ...
阅读全文
摘要:一 Windows卷(Volumn) 1 卷的获取 GetLogicalDrives 返回一个DWORD值,这个值的每个位代表是否存在相应的卷 GetLogicalDriveStrings 获取一个所有卷的盘符的字符串 DWORD GetLogicalDriveStrings( DWORD nBufferLength,//BUFF的大小 LPTSTR lpBuffer );//BUFF的指针 BUFF存放数据的格式: A:\ + 0 + C:\ + 0 ... + 0 Windows的盘符从A-Z 2 卷的类型 UINT GetDrive...
阅读全文
摘要:一 Windows的库 由于项目的复杂程度,或者为了提高代码的重用率等等,所以才引入了库程序。 库包含两种: 1 静态库:扩展名为LIB的文件,是不能被加载的程序,可以理解为目标程序的归档。 2 动态库:扩展名是DLL的文件,是可以被应用程序加载的程序。 二 静态库 1 静态库的特点 1.1 目标程序的归档 1.2 静态库的代码会被嵌入到程序当中。 1.3 程序执行时不需要静态库存在 2 C语言静态库 2.1 创建静态库 创建Win32静态库项目,使用*.C文件建立项目。 在Setting里将library选项卡下的output路径改为 ../lib/*.lib 2.2 添加静态库函数View
阅读全文
摘要:一 组合框 ComboBox 1 组合框的样式 1.1 简单组合框 CBS_SIMPLE 1.2 下拉式组合框 CBS_DROPDOWN 能输入或者从下拉列表中选择 1.3 下拉列表式组合框 CBS_DROPDOWNLIST 只能从下拉列表中选择 2 组合框的使用 2.1 组合框的创建 窗口类名称是 COMBOBOX, 使用CreateWindow创建, 创建时要注意窗口高度(弹出的列表). 2.2 增加选项 CB_ADDSTRING/CB_INSERTSTRING CB_ADDSTRING: WPARAM为0不使用, LPARAM是添加字符串的地址 2.3 删除选项 CB_DELET...
阅读全文
摘要:一 对话框 1 对话框的分类 2 对话框的基本使用方式 3 对话框资源 4 有模式对话框的使用 5 无模式对话框的使用 5.1 添加对话框资源 5.2 定义窗口处理函数 BOOL CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam ); // second message parameter 5.3 创建对话框 HWND CreateDi...
阅读全文
摘要:一 Windows绘图 1 图形绘制 1.1 图形绘制的方式 获取到绘图句柄-设备描述表(DC),使用相应的绘图的API,在设备上绘制图形. 1.2 颜色 R\G\B三色, 每种颜色8位, 共24位颜色. 32位颜色: 颜色数量24位颜色, 多出来的8位表示灰度. 16位: 颜色数量2的16次方. Win32下,颜色的定义 COLORREF(DWORD), RGB宏定义颜色 COLORREF nColor = RGB( 0, 0, 0 ); COLORREF nColor = RGB( 255,255,255 ); COLORREF nColor = RGB( 255,0, 0 ); 从...
阅读全文
摘要:一 系统菜单 1 执行系统提供的窗口命令,例如最大化、关闭等命令。本质上和普通菜单一样,所以我们也可以在程序中使用这个菜单 2 系统菜单的使用 2.1 获取系统菜单 GetSystemMenu HMENU GetSystemMenu( HWND hWnd, //要获取的窗口句柄 BOOL bRevert //获取时重置标示 ); bRevert: TRUE 重置 FLASE 不重置 当Revert为TRUE时,会将菜单重新置成默认的状态,并返回菜单句柄。如果为FALSE,菜单项不重置,获取到当前系统菜单的状态。 2.2 修改系统菜单,例如增加、删除 2.2.1 AppednMen...
阅读全文
摘要:一 鼠标消息 1 鼠标消息 1) 基本鼠标消息 WM_LBUTTONDOWN 左键按下 WM_LBUTTONUP 左键抬起 WM_RBUTTONDOWN 右键按下 WM_RBUTTONUP 右键抬起 WM_MOUSEMOVE 鼠标移动 2) 双击消息 WM_LBUTTONDBLCLK 左键双击 WM_RBUTTONDBLCLK 右键双击 3) 滚轮消息 WM_MOUSEWHEEL 鼠标滚轮 2 消息的参数 WPARAM - 当前键盘和鼠标按键状态,例如MK_CONTROL/MK_SHIFT,MK_LBUTTON等 LPARAM - 当前鼠标的坐标,坐标的原点是窗口客户区的左上角. X坐标 -.
阅读全文
摘要:一 Win32消息机制 1 消息机制 过程驱动:程序是按照我们预先定义好的顺序执行,每执行一步,下一步都已经按照预定的顺序继续执行,直到程序结束。 事件驱动:程序的执行顺序是无序的。某个时间点所执行的代码,是由外界通知。由于我们无法决定用户执行顺序,所以代码的执行也是无序。 Win32的消息机制 - 事件驱动 2 Win32消息程序 2.1 Win32窗口注册 2.2 Win32窗口创建 2.3 WIn32消息循环 2.3.1 GetMessage BOOL GetMessage( LPMSG lpMsg,//存放获取到的消息数据 HWND hWnd,//获取消息...
阅读全文
摘要:一 窗口注册和创建 1 Win32窗口程序创建步骤 1.1 WinMain入口函数的定义 1.2 WindowProc函数的定义 1.3 注册窗口类 RegisterClass/RegisterClassEx 1.4 创建窗口 CreateWindow/CreateWindowEx 1.5 窗口的显示和刷新 ShowWindow/UpdateWindow 1.6 消息处理 GetMessage/DispatchMessage 1.7 窗口退出 WM_DESTROY/PostQuitMessage 2 窗口的注册 2.1 窗口类的分类 2.1.1 系统全局的窗口类.比如按钮("BUTT
阅读全文
摘要:一 NMAKE和Makefile 1.1 NMAKE - 命令解释器,根据Makefile文件中 定义的脚本,完成项目的编译等操作。 1.2 Makefile - 定义编译/链接等脚本语言。 1.3 Makefile文件的编写 1.3.1 基本语法规则window.exe:window.obj // 依赖行 cl.exe window.c /c // 命令行 link.exe window.obj user32.lib window.exe的依赖项是window.obj,如果 window.obj被重新改写,window.exe将重新 生成. 通过时间戳(ti...
阅读全文
摘要:Win32 Windows编程1 Windows编程基础2 Windows文字的编码3 窗口程序4 窗口消息5 菜单和加速键6 绘图7 对话框8 基本控件 .....一 Windows编程基础1 Win32应用程序的基本类型 1.1 控制台程序 不需要完善的Windows窗口,可以使用DOS窗口 的方式显示。 1.2 Win32窗口程序 包含窗口的程序。可以通过窗口与程序进行交互。 1.3 Win32库程序 提供已有的代码,供其他程序使用。 动态库:DLL 是在执行的时候可以加载的程序。 静态库:LIB 是在编译链接时使用的程序。 1.4 对比 1.4.1 程序的入口函数不同 控制台:main
阅读全文
摘要:1、算法 脱离具体的语言 有穷性 --- 在保证执行有限步骤之后确定能够结束 确切性 --- 每条语句具体干什么 输入输出 --- 所有的算法都有输出,打印屏幕,写文件,写DB2、快速排序法 数据个数超过一个,任选其中一个数据作为分界值,把其他数据按大小关系分为2组,分界值在中间 对两组数据实行递归重组View Code //快速排序算法,效率最高的排序算法。第一个参数表示数组首地址,第二个参数表示数组起始位置,第三个参数表示结束位置 void mysort( int * p , int left , int right ){ int l = left ; ...
阅读全文
摘要:1、在头文件中 #ifndef _ACCOUNT_ //预编译选项,表示如果没有定义这个宏 #define _ACCOUNT_ //创建以_ACCOUNT_命名的宏 并声明类 #endif 2、链表 (1)解决数组必须连续存储的问题 链表是可以不连续的,通过每个节点的指针连接 (2)节点中一部分空间用于存放数据,另一部分是一个指向下一个节点的指针 (3)每个节点都是一个结构 struct node{ int data; //存储数据 node* next; //指向...
阅读全文
摘要:1、对文件的分类 (1)文本文件:每个字节都是有效的可显示的ASCII码 ,getline() , >> (2)二进制文件:字节是连续的,不能用vi , more查看文件内容,read按字节数读取 , write 100 是整数的100,占4个字节 “100”是字符数组,占3个字节2、异常 (1)人为错误:由于程序员编码不当 客观错误:不能避免的错误 (2)通过返回值判断程序的错误情况,对调用者的要求高,要写if()else()判断,而且对于返回值的含义要非常的清楚 所以C++中提供了异常处理机制3 异常的工作原理: 1) 程序员写的代码在出现意外的地方自动产生一个异常,然后抛出一
阅读全文
摘要:1、数据 内存中 变量 磁盘上 文件2、把数据从其他的设备搬到内存中 --- 输入 --- 读 把内存中的数据放到其他设备中 --- 输出 --- 写3、流 物质的定向移动,输入输出流中是数据的定向移动 输入流的源头 : 文件 目的地:内存 输出流的源头 : 内存 目的地:文件4、标准输出设备 --- 显示器 标准输入设备 --- 键盘 键盘 --- 内存 --- 显示器 | | 输入操作 输出操作 输入输出流 : 内存与磁盘之间,内存与标准输入输出设备之间的5、cout 源 :变量 目的地 :显示器 cin 键盘 内存中某一变量 6、标准输入流 cin istream的一个对象 标...
阅读全文
摘要:1、拷贝构造函数和运算符重载 (1)当类的成员变量中出现指针类型的时候,需要动态申请空间,这样就需要解决浅拷贝的问题 在声明对象的同时用另一个对象为其赋值,会调用拷贝构造函数。 系统提供的默认拷贝构造函数,是浅拷贝,我们可以自己写一个拷贝构造函数,把指针指向的变量也拷贝过去 (2)类中的成员变量出现指针类型,当两个对象都创建出来了以后,相互赋值的时候,就需要重载赋值运算符号 手工为指针指向的变量赋值2、其他的运算符号重载 对于对象之间的加减操作,系统是不允许的,但通过自己的运算符重载,按照自己的规则,实现对象之间的运算操作。 Integer operator+(const Integer&am
阅读全文
摘要:1、 本对象 子类对象 其他函数 private属性 可见 不可见 不可见 protected属性 可见 可见 不可见 public属性 可见 可见 可见 public extends protected extends private extends 父类的private属性 不能访问 不能访问 不能访问 父类的protected属性 变成protected 不变 变成private,子类可以访问,子类的子类不能访问 父类的public属性 不变 变成protected 变成private,子类可以访问,子类的子类不能访问2、 构造函数有很多种,因为没有指定构造函数,就会默认使用无参的构造函
阅读全文
摘要:1、类和对象 类就是对对象的描述,主要从属性和行为两个方面描述。 对于属性一般作成private , 行为作为public 函数 (1)构造函数,初始化所有的成员变量,系统自动调用,可以重载 (2)析构函数,在对象生命周期结束的时候自动被调用调用,不准重载 构造函数和析构函数都是系统自动调用的,析构函数可以通过对象调用 A a; a.A(); //error 构造函数是不能手工调用的 a.~A(); //right 手工调用析构函数时,会被当作一个普通的成员函数调用,其中的代码会被执行,对象不被销毁 (3)get,set方法 用于访问私有的成员变量的,外界访问变量的唯一通道 (4)类本身的行.
阅读全文
摘要:1、类型封装 类 --> 对象 描述 : (1)属性 (2)行为 ---属性和行为是属于类的 创建对象。2、构造函数 --- 初始化对象 (1)构造函数名字必须与类名一样 (2)构造函数不能写返回类型 构造函数在创建对象时,系统自动调用 构造函数允许重载,按用户要求,适应多种情况 当类中一个构造函数都没有的时候,系统提供默认无参的构造函数 但如果在类中定义了一个构造函数,系统就不提供默认的了,所以,建议,在写构造函数时,都要写一个无参的构造函数3、对类的安全的定义 变量 -> 私有 -> private 保护变量,防止外界随意修改,只能在类的内部使用(只能被自己的成员函数使用
阅读全文
摘要:1、排序函数 void order(int* p1, int* p2){ if(*p1 > *p2){ int temp = *p1; *p1 = *p2; *p2 = temp; } } void sort (int *p , int len , int perLen , void (*pOrder)(void* , void*)){ char* pt = (char*)p; for(int i = 0 ; i < len ; i++){ for(in...
阅读全文
摘要:1、数组是自动分配空间,指针要手工分配空间(int *p = new int;)2、在Unix上,程序出现段错误的时候,系统会生成core 文件,会把出现错误的那一刻的程序镜像保存在此文件中3、结构的成员变量出现数组: struct Account{ long id ; //char name[ 50 ] ; //char password[ 10 ] ; char * pname ; char * ppwd ; double balance ; }; 数组长度100...
阅读全文
摘要:1、数组指针声明的时候不用初始化,声明以后就指向数组的首地址了,以后不允许改变,所以,数组指针可以认为是一个常量,一旦赋值就不能改变2、char数组 (1)打印char数组的名字即打印数组的内容 (2)对于字符数组,'\0'是结束标志 字符 '\0' = 数组0 可以认为字符'\0'的ASCII码就是0 要保存5个字符,就要把字符数组长度声明为6 (3)strcpy()和memset() 给一个字符串数组赋值 strcpy(),自动为字符串补 '\0' 在使用strcpy之前,要调用memset(str,0,sizeof(str)
阅读全文
摘要:1、变量的存储 (1)内存是一块空间,把其中的每个字节做了编号,为了以后计算机能通过编号找到数据 (2)编址方式:绝对编址(在整个程序中使用),相对编址(字节相对于逻辑0偏移量,在进程中使用)2、取变量地址 (1)"&" &i 表示取内存中i的地址 地址的编址用十六进制表示 (2)逻辑0在代码区 全局变量在数据区,地址的编址是大于0的 局部变量在栈区,地址的编址是小于0的 3、数组、结构的地址 (1)数组中的数据在内存中是连续存储的。 数组中每个元素的地址相差的值应为数组元素类型的大小。 (2)结构的地址: 结构的空间是连续的。 结构的起始地址与第一个成员变
阅读全文
摘要:1、程序由函数组成,函数只完成自己特定的功能即可 把函数声明写在头文件里(想使用函数时,可直接导入头文件,调用函数),把函数实现写在".cc"文件中 把多个".cc"文件编译成可执行文件 ->分别编译成".o"文件,再连接到一起2、值传递 函数中的参数传递是值传递,形参只是实参的一份拷贝数据,在函数中改变形参的值,对实参无影响 3、作业分析:显示层(与用户的交互) 操作数据(完成业务逻辑) biz层 数据(id , password , balance )Bank实现代码View Code ===================
阅读全文
摘要:1、cin 输入流一旦破坏,就不能恢复2、函数:一段相关代码组成的集合,以便完成一个特定的目的。 (1)可以通过名字来使用,曾强了代码的可重用性。 (2)提高可维护性。3、函数定义=声明+函数体: <返回类型> 函数名(<参数表>...){ return ... } 函数返回值:只有在调用函数的同时才能保存返回值 函数定义时,小括号里的参数称为形参,在函数被调用的时候才有意义。 函数调用时,小括号里的被传入的参数称为实参。4、函数在调用之前只有声明就可以,因为在编译阶段,参照声明可以完成语法上的检测。 函数声明 <返回类型> 函数名(<参数表>.
阅读全文
摘要:1、%ldd 可执行文件的名字; ---可查看连接库2、C++严格区分大小写,变量命名只能使用字母,数字,或下划线,第一个字母必须使用字母或下划线3、float单精度,double双精度 sizeof(int)---返回int在内存中占的大小 size(bool)=1 size(char)=1 size(short)=2 size(int)=4 size(long)=4 size(float)=4 size(double)=8 无符号的数据一旦溢出,将成为0。 有符号的int最大值2147483647,溢出变为最小值,负数4、不同数据间赋值:有兼容性的,占空间小的数据类型,可以给占空间大的数据
阅读全文
摘要:1、 程序 —— 可执行文件,人发送给计算机的一组指令。 硬件指令是二进制,方便与数字电路和指令集转换。2、 我们学的是符合ANSI规范的标准C++,有可移植性3、 进制:十进制 -> 二进制:除2取余 88 -> 0101 1000 二进制 -> 十进制 : 各个位与权重的乘机,之后的总和 0101 1000 -> 8+16+64 -> 88 十进制 -> 十六进制 :除16取余 88 -> 0x584、 1byte =8 bit 1 kb = 1024 byte 1M = 1024 kb5、 开发周期 源程序 -->? 可执行代码 -->
阅读全文
摘要:回顾:1.QT的编译qmake使用*.pro文件格式2.QT的工具帮助文档配置工具UI设计器3.QT的类的使用一.信号与槽1.背景:面向过程模块之间低耦合设计(高内聚).函数调用:直接调用回调调用面向对象模块之间低耦合设计(高内聚).对象调用直接调用接口调用QT:信号与槽解决问题:对象的成员变量的调用?对象的成员函数的调用?案例:窗体,有一个文本框。线程,每隔一秒改变文本框。问题:线程类访问窗体组件比较麻烦,需要传递。在QT中,使用线程程序可能不工作。2.使用信号与槽最大的好处,不通过参数传递,直接调用对象。以及在对象之间传递数据2.1.头与实现必须分开。2.2.必须继承QObject2.3.
阅读全文
摘要:回顾:线程与进程1.进程由于资源独立,进程的主要关注是解决资源共享2.线程先天是数据共享,线程主要关注共享数据脏1.互斥量(线程内) 读写锁2.信号/条件量调度(线程之间)信号量一.线程的信号量1.定义信号量sem_t2.初始化信号量sem_init3.操作信号量sem_post sem_wait4.释放信号量sem_destroy5.其他函数sem_getvalue案例:创建一个子线程子线程-信号量(阻塞)主线程+信号量(解除阻塞)体会:信号量可以累加+-操作单位是1View Code #include <pthread.h>#include <semaphore.h>
阅读全文
摘要:一.多线程1.了解多线程解决多任务实现。历史上Unix服务器不支持多线程Unix/Linux上实现多线程有两种方式:内核支持多线程使用进程的编程技巧封装进程实现多线程:轻量级多线程多线程的库:libpthread.so -lpthreadpthread.h2.创建多线程2.1.代码?回调函数2.2.线程ID?pthread_t2.3.运行线程?pthread_createint pthread_create(pthread_t *th,//返回进程IDconst pthread_attr_t *attr,//线程属性,为NULL/0,使用进程的默认属性void*(*run)(void*),//
阅读全文