自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 资源 (2)
  • 收藏
  • 关注

原创 3.2 表、栈和队列_表ADT

    大小为0的表为空表。对于除空表外的任何表,Ai+1后继Ai(或继Ai之后)并称Ai-1(i1)。表中的第一个元素是A1,而最后一个元素是AN。不定义A1的前驱元,也不定义AN的后继元。3.2.2 链表    为了避免插入和删除的线性开销,需要允许表可以不连续存储,否则表的部分或全部需要整体移动。    链表有一系列不必在内存中相连的结构组成。每一个结构均含有表元素和指向包含该元素的后继元的结构的指针。3.2.3 程序设计细节

2010-08-31 00:54:00 520

转载 c与c++混合编程(下)

<br />Mixing C and C++ Code in the Same Program<br /> <br />By Stephen Clamage, Sun Microsystems, Sun ONE Studio Solaris Tools Development Engineering<br /> <br />Translator: Qiu Longbin <robin.qiu(at)yeah.net><br /> <br />C++语言提供了一个混合代码的机制,使得代码可以在同一个程序中被兼

2010-08-30 17:00:00 1191

转载 c与c++混合编程(上)

[32] How to mix C and C++ 如何混合使用C和C++<br />(Part of C++ FAQ Lite, Copyright © 1991-2006, Marshall Cline, [email protected])Translator: Qiu Longbin <robin.qiu(at)yeah.net> FAQs in section [32]:·       [32.1] 混合使用C和C++代码时我需要知道什么?·       [32.2] 如何在C++代码里inc

2010-08-30 16:57:00 625

转载 c与c++混合编程(CU)

1.引言   C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。2.从标准头文件说起  某企业曾经给出如下的一道面试题:  面试题  为什么标准头文件都有类似

2010-08-30 16:48:00 1018

原创 7.4 下半部和推后执行的工作_工作队列

<br />    工作队列可以把工作推后,交由一个内核线程去执行--这个下半部分总是会在进程上下文执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许重新调度甚至是睡眠。<br />    通常,在工作队列和软中断/tasklet中作出选择非常容易。如果推后执行的任务需要睡眠,那么就选择工作队列。如果推后执行的任务不需要睡眠,那么就选择软中断或tasklet。<br />    如果你需要用一个可以重新调度的实体执行你的下半部处理,你应该使用工作队列。它是唯一能在进程上下

2010-08-27 00:20:00 1143

原创 7.2 下半部和推后执行的工作_tasklet

7.3.1 tasklet的实现<br />    因为tasklet是通过软中断实现的,所以它们本身也是软中断。tasklet由两类软中断代表:HI_SOFTIRQ和TASKLET_SOFTIRQ。这两者之间唯一的实际区别在于HI_SOFTIRQ类型的软中断先于TASKLET_SOFTIRQ类型的软中断执行。<br /> 1. tasklet结构体<br />    tasklet有tasklet_struct结构表示。每个结构体单独代表一个tasklet,它在<linux/interrupt.h>中定义

2010-08-26 00:34:00 662

原创 7.2 下半部和推后执行的工作_软中断

7.2.1 软中断的实现    软中断是在编译期间静态分配的。它不像tasklet那样能被动态地注册或去除。软中断由softirq_action结构表示,它定义在:struct softirq_action{    void (*action) (struct softirq_action *);    void *data;} 1. 软中断处理程序    一个软中断不会抢占另外一个软中断。实际上,唯一可以抢占软中断的是中断处理程序。不过,其他的软中断--甚至是相同类型的软中断--可以在其他处理器上同时执行

2010-08-25 22:33:00 758 1

原创 7.1 下半部和推后执行的工作_下半部

<br />    下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。记住,中断处理程序会异步执行,并且在最好的情况下它也会锁定当前的中断线。对于在上半部和下半部直接按划分工作,尽管不存在某种严格的规则,但还是有一些提示可供借鉴:如果一个任务对时间非常敏感,将其放在中断处理程序中执行。如果一个任务和硬件相关,将其放在中断处理程序中执行。如果一个任务要保证不被其他中断(特别是相同的中断)打断,将其放在中断处理程序中执行。其他所有任务,考虑放置在下半部执行。<br /> 7.1.1 为什么要

2010-08-25 00:51:00 511

原创 Eclipse

    Eclipse 是IBM主持开发的优秀的开源IDE,可用于各种编程语言,例如Java,C、C++等。  1. 下载可以到 Eclipse 的官方网站下载,也可以下面这个地址直接下载Eclipse IDE for C/C++ Developers : Eclipse 3.6/Helios: http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/R/eclipse-c

2010-08-14 16:38:00 1301

原创 5.13 标准I/O库_临时文件

    ISO C标准I/O库提供了两个函数以帮助创建临时文件。#include char *tmpnam(char *ptr);返回值:指向唯一路径名的指针FILE *tmpfile(void);返回值:成功返回文件指针,出错返回NULLtmpnam函数产生一个与现有文件名不同的一个有效路径名字符串。每次调用它时,它都产生一个不同的路径名,最多调用次数是TMP_MAX。TMP_MAX定义在中。    若ptr是NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。下一次在调用tm

2010-08-13 17:08:00 524

原创 5.12 标准I/O库_实现细节

<br />    在UNIX系统中,标准I/O库最终都要调用第3章中说明的I/O例程。每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获得其描述符。#include <stdio.h>int fileno(FILE *fp);<br />返回值:与该流相关联的文件描述符

2010-08-12 11:01:00 340

原创 5.11 标准I/O库_格式化I/O

1. 格式化输出<br />    执行格式化输出处理的是4个printf函数。#include <stdio.h>int printf(const char *restrict format, ...);int fprintf(FILE *restrict fp, const char *restrict format, ...);<br />返回值:成功返回输出字符数,出错返回负值int sprintf(char *restrict buf, const char *restrict format, .

2010-08-12 10:46:00 571

原创 5.10 标准I/O库_定位流

    有三种方法定位标准I/O流。ftell和fseek函数。它们都假定文件的位置可以存放在一个长整型中。ftello和fseeko函数。可以使文件偏移量不必一定使用长整型。它们使用off_t数据类型代替了长整型。fgetpos和fsetpos函数。这两个函数是由ISO C引入的。它们使用一个抽象数据类型fpos_t记录文件的位置。这种数据类型可以定义为记录一个位置所需的长度。#include long ftell(FILE *fp);返回值:成功返回当前文件位置指示,出错返回-1Lint fseek(F

2010-08-10 17:58:00 752

原创 5.9 标准I/O库_二进制I/O

<br />    下列两个函数执行二进制I/O操作:#include <stdio.h>size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);<br />返回值:读或写的对象数<br />    这两个函数有两种常见的用法:读或写一个二进

2010-08-10 16:17:00 412

原创 5.7 标准I/O库_每次一行I/O

<br />    下面两个函数提供每次输入一行的功能。#include <stdio.h>char *fgets(char *restrict buf, int n, FILE *restrict fp);char *gets(char *buf);<br />返回值:成功返回buf,已到达文件结尾或出错则返回NULL<br />这两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读。<br />    对于fgets,必须指定缓冲区的长度n。此函数一直读到下

2010-08-09 15:48:00 396

原创 5.6 标准I/O库_读和写流

    一旦打开了流,则可在三种不同类型的非格式化I/O中进行选择,对其进行读、写操作:每次一个字符的I/O。一次读或写一个字符,如果流是带缓冲的,则标准I/O函数会处理所有缓冲。每次一行的I/O.直接I/O。直接I/O这个术语来自ISO C标准,有时也被称为二进制I/O、一次一个对象I/O、面向记录的I/O表面向结构的I/O。 1. 输入函数    以下三个函数可用于一次读一个字符:#include int getc(FILE *fp);int fgetc(FILE *fp);int getchar(vo

2010-08-09 11:54:00 477

原创 5.5 标准I/O库_打开流

    下列三个函数打开一个标准I/O流。#include FILE *fopen(const char *restrict pathname, const char *restrict type);FILE *fropen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);FILE *fdopen(int filedes, const char *type);返回值:成功返回文件指针,出错返回NULL 

2010-08-07 17:10:00 782

原创 5.4 标准I/O库_缓冲

    标准I/O提供了三种类型的缓冲。全缓冲: 在填满标准I/O缓冲区后才进行实际I/O操作。对于驻留在磁盘上的文件通常是有标准I/O库实施全缓冲。行缓冲: 当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。当涉及一个终端(例如标准输入和输出),通常使用行缓冲。对于行缓冲有两个限制。第一,因为标准I/O库用来收集每一行的缓冲区的长度是固定的,所以只要填满了缓冲区,那么即使还没有写一个换行符,也进行I/O操作。第二,任何时候只要通过标准I/O库要求从(a)一个不带缓冲的流,或者(b)一个行缓冲的流(

2010-08-07 11:54:00 434

原创 5.3 标准I/O库_标准输入、标准输出和标准出错

<br />    标准输入、标准输出和标准出错用文件描述符引用是:STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,而用文件指针引用是:stdin、stdout和stderr。

2010-08-06 17:38:00 331

原创 5.2 标准I/O库_流和FILE对象

<br />    在第3章中,所有I/O函数都是针对文件描述符的。而对于标准I/O库,它们的操作则是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相关联。<br /><br />    对于ASCII字符集,一个字符用一个字节表示。对于国际字符集,一个字符可用多个字节表示。标准I/O文件流可用于单字节或多字节(“宽”)字符集。流的定向决定了所读、写的字符是单字节还是多字节的。当一个流最初被创建时,它并没有定向。如若在未定向的流上使用一个多字节I/O函数,则将该流的定向设置

2010-08-06 17:33:00 652

原创 3.18 文件I/O_习题

3.1<br />    所有的磁盘I/O都要经过内核的块缓冲区(也称为内核的缓冲区高速缓存),唯一例外的是对原始磁盘设备的I/O。“不带缓冲的I/O”指的是在用户的进程中对这两个函数不会自动缓冲,每次read或write就要进程一次系统调用。<br /> 3.3<br />    每次调用open函数就分配一个新的文件表项,调用dup引用已存在的文件表项。

2010-08-06 15:51:00 380

原创 3.17 文件I/O_小结

    因为read和write都在内核执行,所以称这些函数为不带缓冲的I/O函数。    将ioctl用于STREAMS I/O系统,将fcntl用于记录锁。

2010-08-06 15:45:00 363

原创 3.16 文件I/O_/dev/fd

<br />    打开文件/dev/fd/n等效于复制描述符n(假定描述符n是打开的)[dup]。<br />    大多数系统忽略它所指定的mode,而另外一些则要求mode必须是所涉及的文件原先打开时所使用mode的子集。<br /> 

2010-08-06 15:41:00 597

原创 3.14 文件I/O_fcntl函数

<br />    fcntl函数可以改变已打开的文件的性质。#include <fcntl.h>int fcntl(it filedes, int cmd, .../* int arg */);<br />返回值:成功则依赖于cmd,出错返回-1<br />    fcntl函数有5中功能:复制一个现有的描述符(cmd=F_DUPFD)。获得/设置文件描述符标记(cmd=FD_GETFD或F_SETFD)。获得/设置文件状态标志(cmd=FD_GETFL或F_SETFL)。获得/设置异步I/O所有权(cm

2010-08-06 15:37:00 475

原创 6.7 中断和中断处理程序_中断控制

<br />    一般来说,控制中断系统的原因归根到底是需要提供同步。<br /> 6.7.1 禁止和激活中断<br />    用于禁止当前处理器(仅仅是当前处理器)上的本地中断,随后又激活它们的语句为:local_irq_disable();load_irq_enable();<br />    如果在调用local_irq_disable()例程之前已经禁止了中断,那么该例程往往会带来潜在的危险;同样相应的load_irq_enable()例程也存在潜在危险,因为它将无条件地激活中断,尽管这些中断可

2010-08-05 00:45:00 651

原创 3.13 文件I/O_sync、fsync和fdatasync函数

<br />    当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲去尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被成为延迟写。<br />    为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。#include <unistd.h>int fsync(int filede

2010-08-04 18:04:00 1283

原创 3.12 文件I/O_dup和dup2函数

    下面两个函数都可用来复制一个现存的文件描述符:#include int dup(int filedes);int dup2(int filedes, int filedes2);返回值:成功返回新的文件描述符,出错返回-1    有dup返回的新文件描述符一定是当前可用文件描述符的最小数值。用dup2则可以用filedes2参数指定新描述符的数值。如果filedes2已经打开,则先将其关闭。如若filedes等于filedes2,则dup2返回filedes2,而不关闭它。    这些函数返回的新文

2010-08-04 17:46:00 538

原创 3.11 文件I/O_原子操作

1. 添写至一个文件    任何一个需要多个函数调用的操作都不可能是原子操作,因为在两个函数调用之间,内核有可能会临时挂起该进程。    UNIX系统提供了一种方法使这种操作成为原子操作,该方法是在打开文件时设置O_APPEND标志。这就使内核每次对这种文件进行写之前,都将进程的当前偏移量设置到该文件的尾端处,于是在每次写之前就不再需要调用lseek。 2. pread和pwrite函数    Single UNIX Specification包括了XSI扩展,该扩展允许原子性地定位搜索(seek)和执行I

2010-08-04 16:12:00 869

原创 3.10 文件I/O_文件共享

<br />    内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。    (1)每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:文件描述符标志(close_on_exec)。指向一个文件表项的指针。<br />    (2)内核为所有打开文件维持一张文件表。每个文件表项包含:文件状态标志(读、写、添写、同步和非阻塞等)。当前文件偏移量。指向该文件v节点表项的指

2010-08-04 12:01:00 483

原创 6.8 中断和中断处理程序_别打断我,马上结束

<br />    中断是一种由设备使用的硬件资源异步地向处理器发信号。实际上,中断就是由硬件来打断操作系统。<br />    内核提供的接口包括注册和注销中断处理程序,禁止中断,屏蔽中断线,以及检查中断系统的状态。

2010-08-04 00:54:00 469

原创 6.6 中断和中断处理程序_中断处理机制的实现

<br />    中断处理系统在Linux中的实现是非常依赖于体系结构的。<br />    SA_INTERRUPT表示处理程序必须在中断禁止的情况下运行。<br /> /proc/interrupts

2010-08-04 00:36:00 307

原创 6.5 中断和中断处理程序_中断上下文

<br />    当执行一个中断处理程序或下半部时,内核处于中断上下文中。进程上下文是一种内核所处的操作模式,此时内核代表进程执行--例如,执行系统调用或运行内核线程。因为进程是以进程上下文的形式连接到内核中的,因此,在进程上下文可以睡眠,也可以调用调度程序。<br />    如果一个函数睡眠,就不能在你的中断处理程序中使用它。<br />    中断上下文具有较为严格的时间限制,因为它打断了其他代码。中断上下文中的代码应当迅速简洁,尽量不要使用循环去处理繁重的工作。<br />    中断处理程序栈的

2010-08-04 00:25:00 377

原创 6.4 中断和中断处理程序_编写中断处理程序

<br />    以下是一个典型的中断处理程序声明:static irqreturn_t intr_handler(intirq, void *dev_id, struct pt_regs *regs)<br />    第一个参数irq就是这个处理程序要响应的中断的中断线号。<br />    第二个参数dev_id是一个通用指针,它与在中断处理程序注册时传递给request_irq()的参数dev_id必须一致。如果该值有唯一确定性(建议采用这样的值,以便支持共享),那么它就相当于一个cookie,可

2010-08-04 00:16:00 689

原创 6.3 中断和中断处理程序_注册中断处理程序

<br />    驱动程序可以通过下面的函数注册并激活一个中断处理程序,以便处理中断:int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irgflags, const char *devname, void *dev_id)<br />    第一个参数irq表示要分配的中断号。<br />    第二个参数handler是一个指针,指向处理这个中断的

2010-08-03 22:54:00 908

原创 6.2 中断和中断处理程序_中断处理程序

<br />    在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。中断处理程序通常不是和特定设备关联,而是和特定中断关联的,也就是说,如果一个设备可以产生多种不同的中断,那么该设备就可以对应多个中断处理程序,相应的,该设备的驱动程序也就需要准备多个这样的函数。一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码。<br />    中断处理程序与其他内核函数的真正区别在于:中断处理程序是被内核调用来响应中断的,而它们运行于我们称之

2010-08-03 22:13:00 543

原创 6.1 中断和中断处理程序_中断

<br />    不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识。这些中断值通常被称为中断请求线。对于连接在PCI总线上的设备而言,中断时动态分配的。<br /> 异常<br />    异常与中断不同,它在产生时必须考虑与处理器时钟同步。实际上,异常也常常称为同步中断。在处理器执行到由于编程失误而导致的错误指令(例如被0除)的时候,或者是在执行期间出现特殊情况(例如缺页),必须靠内核来处理的时候,处理器就会产生一个异常。

2010-08-03 21:44:00 411

原创 3.8 文件I/O_write函数

    调用write函数向打开的文件写数据:#include ssize_t write(int filedes, const void *buf, size_t nbytes);返回值:成功返回已写的字节数,出错返回-1    其返回值通常与参数nbytes的值相同,否则表示出错。write出错的一个常见原因是:磁盘意写满,或者超过了一个给定进程的文件长度限制。

2010-08-03 15:28:00 545

原创 3.7 文件I/O_read函数

<br />    调用read函数从打开文件中读数据:#include <unistd.h>ssize_t read(int filedes, void *buf, size_t nbytes);<br />返回值:成功返回读到的字节数,若已到文件结尾返回0,出错返回-1<br />    有很多中情况可使实际读到的字节数少于要求读的字节数:读普通文件时,在读到要求字节数之前已到达了文件尾端。当从终端设备读时,通常一次最多读一行。当从网络读时,网络中的缓冲机制可能造成返回值小于所要求读的字节数。当从管道或

2010-08-03 15:23:00 529

原创 3.6 文件I/O_lseek函数

<br />    每个打开的文件都有一个与其相关联的“当前文件偏移量”。通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。按系统默认的情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0。可以调用lseek显式地为一个打开的文件设置起偏移量。#include <unistd.h>off_t lseek(int filedes, off_t offset, int whence);<br />返回值:成功返回新的文件偏移量,出错返回-1<br />    对参数

2010-08-03 15:06:00 2915

原创 3.5 文件I/O_close函数

<br />    可调用close函数关闭一个打开的文件。<br />#include <unistd.h><br />int close(int filedes);<br />返回值:成功返回0,出错返回-1<br />    关闭一个文件时还会释放该进程加在该文件上的所有记录锁。当一个进程终止时,内核自动关闭它所有打开的文件。

2010-08-03 14:40:00 407

嵌入式资料整合第二辑

对当前的嵌入式技术的资料进行整合,对于想了解嵌入式技术和想知道怎样学嵌入式的朋友非常有帮助!

2010-05-10

嵌入式资料整合第一辑

对当前的嵌入式技术的资料进行整合,对于想了解嵌入式技术和想知道怎样学嵌入式的朋友非常有帮助!

2010-05-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除