摘要:在标准 C 或者 C++ 中由于不支持 0 长度的数组,所以 int array[0]; 这样的定义是非法的。不过有些编译器的扩展功能支持 0 长度的数组。在 C 中,0 长度的数组的主要用途是用来作为结构体的最后一个成员,然后用它来访问此结构体对象之后的一段内存(通常是动态分配的内存)。由于其非标准性,在程序中尽量避免使用 0 长度的数组。作为替换,可以使用 C99 标准中的不完整数组来替换 0 长度的数组定义。如:CODE:struct X {/* Members */int array[]; /* Do not write int array[0]; since it is not st
阅读全文
摘要:C语言里的位域是—个比较复杂的问题,涉及的方面也比较多,关于位域的基础内容可以参考以下文章:理解C语言位域 分析代码如下: #include "stdio.h" #include "memory.h" typedef struct _BitSeg1{ int a:4; int b:3; }BitSeg1; typedef struct _BitSeg2{ char a:4; char b:3; }BitSeg2; int main() { BitSeg1 ba1; b...
阅读全文
摘要:系统:ubuntu 11.04 little-end描述:这个问题是在研究TS包头解析时遇到的,用两种方式取TS包头,但结果不同耗时:2天程序:1. 使用正常顺序方式定义TS包头结构体,然后将TS包头数据拷贝到包头结构体中。void bob_get_packet_header_mem_cpy_1(unsigned char *ts_package)
{ printf(" [%s]:\n", __func__); printf(" Package Source Data: "); unsigned char *p = ts_package; while(p
阅读全文
摘要:1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。4,C++程序经常要
阅读全文
摘要:http://pcedu.pconline.com.cn/empolder/gj/c/0503/568909.html
阅读全文
摘要:template<typename T>NamedObject<typename T>::NamedObject(const char *name, const T& value)的定义格式在vs中可以顺利编过,但是在gcc中会报 error: template argument 1 is invalid的错误,应该定义成 去掉第二个typenametemplate<typename T>NamedObject<T>::NamedObject(const char *name, const T& value)
阅读全文
摘要:http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html关于函数重载,一篇写得比较好的文章。
阅读全文
摘要:在project -> settings -> link -> project options里,把project设置中的/subsysetm:Windows改为/subsystem:console
阅读全文
摘要:gcc -o test test.c -Wl,-Map,test.mapgcc shellex.c ../src/csapp.c -I../include/ -lpthread编成共享库.sogcc -shared -fPIC -o libvector.so addvec.c multvec.cgcc -rdynamic -O2 -o p3 dll.c -ldl静态库动态库混合使用时要加特殊指令:gcc -g -lstdc++ -g -WI,-dynamic -L. -lmy -WI,-static -L. -lmy -o test.exe main.cc
阅读全文
摘要:字符编码是怎么回事 0. 概念 字节是计算机的最基本存储单位,一个字节包括8个位. 字符是一种文字的基本单位,比如'A' 是一个字符,'汉' 也是一个字符. 1. 计算机被发明之后,程序员们编写了很多复杂的计算让计算机运行. 但是一个问题是,计算机如何把辛苦计算的结果告知程序员? 假设计算机把计算结果放在某个寄存器,内容是 1010010 总不能让程序员去检测每个引脚的电位吧? 还是得有个显示器. 显示器是依靠点阵来显示图像的. CPU必须告诉显示器,当CPU 把一个字节的数据比如 00101010 放入显示器寄存器的时候,显示器要显示怎样的一个点阵(...
阅读全文
摘要:1. C语言中的位操作符 因为C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力,所以C语言支持全部的位操作符(Bitwise Operators)。位操作是对字节或字中的位(bit)进行测试、置位或移位处理,在对微处理器的编程中,特别适合对寄存器、I/O端口进行操作。因而本节将对此作比较详细地介绍。 6种位操作符的形式与含义如下: & :按位“与”(AND); | :按位“或”(OR); ^ :按位“异或”(XOR); ~ :“取反” (NOT); >> :数据右移; 1) 按位“与”运算 按位“与”运算符 & 的作用是对...
阅读全文
摘要:printf("/033[字背景颜色;字体颜色m字符串/033[0m" ); printf("/033[41;32m字体背景是红色,字是绿色/033[0m/n"); 41是字背景颜色, 32是字体的颜色, 字体背景是红色,字是绿色是字符串. 后面的/033[0m是控制码. 颜色代码: QUOTE: 字背景颜色范围: 40--49 字颜色: 30--39 40: 黑 30: 黑 41: 红...
阅读全文
摘要:本文详细的介绍了Linux内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的API,使用要求以及一些典型示例 一、引言 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问。 在主流的Linux内核中包含了几乎所有现代的操作系统具有的同步机制,这些同步机制包括:原子操作、信号量(semaphore)、读写信号量(rw_semaphore)、spinlock、BKL(Big Kernel Lock)、rw...
阅读全文
摘要:1 Linux进程的睡眠和唤醒 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。 当然,一个进程也可以主动释放CPU的控制权。函数schedule()是一个调度函数,它可以被一个进程主动调用,从而调度其它进程占用CPU。一旦这个主动放弃CPU的进程被重新调度占用CPU,那么它将从上次停止执行的位置开始执行,也就是说它将从调用schedule()的下一行代码处开始执行。 ...
阅读全文
摘要:转自:http://blog.chinaunix.net/u3/112940/showart_2450064.html 由于前两天在看netconsole的源码实现中,发现其跟printk的实现机制相关,加之之前一直是很普通的使用printk,从不清楚printk到底是怎样工作的,因此就趁这个机会把printk的实现代码也给大致看了一下,代码流程并不复杂,下面就简要说明一下。 printk在内核中的实现代码如下。 asmlinkage int printk(const char *fmt, ...) { va_list args; int r; /*将fmt后的参数信息保存到args中*/ v
阅读全文
摘要:内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("<6>Hello, world!/n");。内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。#define KERN_EMERG "<0>" /* system is unusable */#define KERN_ALERT "<1>" /* action must be taken immediately *
阅读全文
摘要:1. I/O模型 Unix下共有五种I/O模型 a. 阻塞I/O b. 非阻塞I/O c. I/O复用(select和poll) d. 信号驱动I/O(SIGIO) e. 异步I/O(Posix.1的aio_系列函数) 1). 阻塞I/O模型 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待。。。。 数据准备好了,从内核拷贝到用户空间 I/O函数返回成功指示2). 非阻塞I/O模型 我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试 数据是否已经准备好,如果没
阅读全文
摘要:结构体file_operations在头文件 linux/fs.h中定义,用来存储驱动内核模块提供的对设备进行各种操作的函数的指针。该结构体的每个域都对应着驱动内核模块用来处理某个被请求的 事务的函数的地址。举个例子,每个字符设备需要定义一个用来读取设备数据的函数。结构体 file_operations中存储着内核模块中执行这项操作的函数的地址。一下是该结构体 在内核2.6.5中看起来的样子:struct file_operations {struct module *owner; loff_t(*llseek) (struct file *, loff_t, int); ssize_t(*r
阅读全文
摘要:了解linux的内存模型,或许不能让你大幅度提高编程能力,但是作为一个基本知识点应该熟悉。坐火车外出旅行时,即时你对沿途的地方一无所知,仍然可以到达目标地。但是你对整个路途都很比较清楚的话,每到一个站都知道自己在哪里,知道当地的风土人情,对比一下所见所想,旅程可能更有趣一些。类似的,了解linux的内存模型,你知道每块内存,每个变量,在系统中处于什么样的位置。这同样会让你心情愉快,知道这些,有时还会让你的生活轻更松些。看看变量的地址,你可以大致断定这是否是一个有效的地址。一个变量被破坏了,你可以大致推断谁是犯罪嫌疑人。Linux的内存模型,一般为:地址作用说明>=0xc000 0000内
阅读全文
摘要:共享内存共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。 快速本地通信 因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。 因为系统内核没有对访问共享内存进行同步,您必须提供自己的同步措施。例如,在数据被写入之前不允许进程从共享内存中读取信息、不允许...
阅读全文
|