上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 19 下一页
摘要: 结合阻塞与非阻塞访问、poll 函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”地概念,比较准确的称谓是:信号驱动(SIGIO)的异步 I/O。可以使用signal()函数来设置对应的信号的处理函数。函数原型是:void (*signal(int signo,void (*func)(int))) (int)我们先来看一个使用信号驱动的例子,通过signal(SIGIO,input_handler) 对打开的文件fd 启动信号机制,输入可获得时inputhand 阅读全文
posted @ 2012-05-31 22:40 KingsLanding 阅读(6633) 评论(1) 推荐(2) 编辑
摘要: 首先再来提一下I/O多路转接的基本思想:先构造一张有关描述符的表,然后调用一个函数,它要到这些描述符中的一个已准备好进行 I/O时才返回。在返回时,它告诉进程哪一个描述符已准备好可以进行 I/O。select函数的参数将告诉内核:(1) 我们所关心的描述符。(2) 对于每个描述符我们所关心的条件(是否读一个给定的描述符?是否想写一个给定的描述符?是否关心一个描述符的异常条件?)。(3) 希望等待多长时间(可以永远等待,等待一个固定量时间,或完全不等待)select从内核返回后内核会告诉我们:(1) 已准备好的描述符的数量。(2) 哪一个描述符已准备好读、写或异常条件。select 用于查询设备 阅读全文
posted @ 2012-05-31 21:03 KingsLanding 阅读(7508) 评论(0) 推荐(2) 编辑
摘要: I/O多路转接至今还不是 POSIX的组成部分。SVR4和 4.3 + BSD都提供select函数以执行I/O多路转接。poll函数只由SVR4 提供。SVR4 实际上用poll实现select。I/O多路转接的基本思想是:先构造一张有关描述符的表,然后调用一个函数,它要到这些描述符中的一个已准备好进行 I/O时才返回。在返回时,它告诉进程哪一个描述符已准备好可以进行 I/O。I/O多路转接在服务器端用的比较多,可以同时处理多个连接的接入,但是也有缺陷,貌似只能接受1024个接入,因此现在又了epoll,当然这不是讨论的重点了。select的函数原型为:int select(int numf 阅读全文
posted @ 2012-05-30 23:09 KingsLanding 阅读(2208) 评论(0) 推荐(0) 编辑
摘要: 用户程序需要系统提供服务的时候,会通过系统调用产生一个int 0x80的软中断,就会进入到系统调用的入口函数,入口函数存放在以下文件当中:以下是系统调用的入口:(arch/x86/kernel/entry_32.S)http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/arch/x86/kernel/entry_32.S517 ENTRY(system_call)518 RING0_INT_FRAME # can't unwind into user space anyway519... 阅读全文
posted @ 2012-05-29 23:49 KingsLanding 阅读(4021) 评论(0) 推荐(0) 编辑
摘要: 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。死锁要产生必须具备四个必要条件:1. 互斥条件 2. 请求和保持条件 3.不可剥夺条件 4. 环路等待条件。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。一下举一个Linux环境下产生死锁的程序(首先是驱动部分):#include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <as 阅读全文
posted @ 2012-05-29 22:08 KingsLanding 阅读(1219) 评论(0) 推荐(0) 编辑
摘要: 在编写Linux内核驱动程序的时候,如果不动态生成设备号的话,需要自己手动分配设备号,有可能你分配的设备号会与已有设备号相同而产生冲突。因此推荐自动分配设备号。使用下面的函数:int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)该函数需要传递给它指定的第一个次设备号baseminor(一般为0)和要分配的设备数count,以及设备名,调用该函数后自动分配得到的设备号保存在dev中。当使用了alloc_chrdev_region()动态分配设备号之后,需要依次使用... 阅读全文
posted @ 2012-05-22 23:02 KingsLanding 阅读(8998) 评论(0) 推荐(1) 编辑
摘要: /*基本思想就是将所有结点分成两个集合,一个是st所在的集合,另一个是st不在的集合,每次从不包含st的集合中找出一个最优的结点加入到st所在的集合,并更新st到所有不在其所在集合中的点的距离。使用一个visit[]数组来标识结点在哪一个集合中。使用dist[]数组来记录st结点到其他结点的最短路径。*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;int const MAXN = 1000;const int INF = 1000000000;int g[ 阅读全文
posted @ 2012-05-21 22:33 KingsLanding 阅读(372) 评论(0) 推荐(0) 编辑
摘要: 我使用的是Visual Studio 11 beta,Win7系统。下面示例程序中通过使用_CrtDumpMemoryLeaks() 或 _CrtSetDbgFlag()来进行内存泄露检测。当发生内存泄露的时候在debug窗口会给出内存泄露的信息,其中_CrtDumpMemoryLeaks用来需要检测的代码的后面,_CrtSetDbgFlag() 用在程序的一开始,总的来说_CrtSetDbgFlag() 比较强大一点。在程序的开头最好加上以下宏定义:#ifdef _DEBUG#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)#endif这样在 阅读全文
posted @ 2012-05-19 12:47 KingsLanding 阅读(3010) 评论(0) 推荐(0) 编辑
摘要: 链表合并先,将两个链表排序,在合并的时候引入一个内存泄露的问题,之后会继续讨论。#include <ctime>#include <cstdlib>#include <iostream>#include <cstdio>using namespace std;#define NN#define RANGE 100#define NUM 10struct node{int value;node * next;node(int v = -1, node *nxt = NULL) : value(v),next(nxt){}};node * make_ 阅读全文
posted @ 2012-05-18 22:47 KingsLanding 阅读(2992) 评论(0) 推荐(0) 编辑
摘要: 就直接贴代码了:#include <iostream>#include <ctime>#include <cstdlib>using namespace std;#define NN 1struct node{int value;node * next;node(int v = -1, node *nxt = NULL) : value(v),next(nxt){}};node* reverse(node * ); //直接使用 node 代表这个结构体node * make_link();void display(node *);int main(){no 阅读全文
posted @ 2012-05-18 22:37 KingsLanding 阅读(229) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 19 下一页