C language
文章平均质量分 75
unbutun
这个作者很懒,什么都没留下…
展开
-
C语言中 i++ 和 ++i 有什么区别?
今天有同学问C语言中for循环里那个 i++ 和 ++i 是否有区别,我告诉他在for循环中是没有区别的,现在具体说一下 i++ 和 ++i 的区别。我们先用while语句写一下 for(i=1;iint i=0;while (iprintf("www.slyar.com");i++;}再用while语句写一下 for(i=1;iint i=0;while (iprintf(转载 2009-11-15 15:47:00 · 1899 阅读 · 5 评论 -
__builtin_prefetch
<br />http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html<br /> <br />Next: Target Builtins, Previous: Vector Extensions, Up: C Extensions5.44 Other built-in functions provided by GCC<br />GCC provides a large number of built-in functions other转载 2010-07-08 22:04:00 · 1844 阅读 · 0 评论 -
shell 下是先调用fork系统调用复制了一个父进程,然后用复制这个进程执行sys_execve加载elf覆盖fork出来那个进程,实现应用层进程的加载创建
大家都知道如何产生一个新的进程。 通过sys_fork,之后再调用sys_execve 系统初启后(核心态)的第一个用户态进程是init。转载 2010-05-27 20:19:00 · 1314 阅读 · 0 评论 -
void及void指针含义的深刻解析(转,void * 在gcc中被看做char *处理,即void *p; p++;实际加1,而不是加整形的4或者long型的8)
<br />void的含义<br /> void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。<br />void指针使用规范<br />①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:<br /> int *pint;<br /> void *pvoid;<br /> pvoid = pint; /* 不过不能 pint = pvoid; */<br /> 如果要将pvoid赋给其他类型指针,则需要强制类型转转载 2010-09-15 20:58:00 · 3758 阅读 · 3 评论 -
memcpy VS memmove
<br />区别:<br />从DESCRIPTION看来,两者的功能基本相同,唯一不同的是,当 dest 和 src 有重叠的时候选用不同的函数可能会造成不同的结果。不妨写个小程序来测一下:<br />0 #i nclude <string.h><br />1 #i nclude <stdio.h><br />2<br />3 int main()<br />4 {<br />5 int i = 0;<br />6 int a[10];<br />7 <br />8 for(i; i <转载 2010-09-28 20:01:00 · 314 阅读 · 1 评论 -
函数调用栈详解(good)
<br /><br /> <br /> <br />全国嵌入式人才培训基地<br /><br />1. 函数调用<br />上一页 <br />第 19 章 汇编与C之间的关系<br /> 下一页<br />1. 函数调用请点评<br />我们用下面的代码来研究函数调用的过程。<br />例 19.1. 研究函数的调用过程<br />int bar(int c, int d)<br />{<br /> int e = c + d;<br /> retu转载 2010-12-02 20:32:00 · 1681 阅读 · 0 评论 -
发一个位操作的文章链接(转自CU,有时间研究下,先存着)
Bit Twiddling Hacks By Sean Eron Anderson<br />seander@cs.stanford.edu <br />Individually, the code snippets here are in the public domain (unless otherwise noted) — feel free to use them however you please. The aggregate collection and descriptions are ©转载 2011-05-08 16:31:00 · 570 阅读 · 0 评论 -
内核代码中的GNU C扩充
<br />我们在浏览Linux内核源代码时,经常会碰到一些非常奇怪的代码记号。按照我们之前对C语言的一般掌握,这些代码记号通常都算不上是符合C语言语法的。那这是怎么回事呢?其实,这基本上是GNU C对 C语言标准的扩充,有了这些扩充,人们就可以更方便的开发,开发出的程序经过GCC编译后,也会产生更有效的二进制代码。<br />通常情况下,我们写C代码都不大会用到这些扩充,这只是因为很简单的原因,那就是我们还不知道它们带来的好处,或者我们是在用GCC以外的编译器做开发。不过如果我们想探索研究Linux内核代转载 2011-05-25 21:22:00 · 397 阅读 · 0 评论 -
Linux内核构建系统之二
<br />yihect | 08 元月, 2011 09:30<br />Linux内核构建系统所支持的目标 <br />由前面的概述可以知道,不管是kconfig步骤、还是kbuild步骤、还是安装都可藉由"make targets"形式的命令来完成。所以,分析一下所有可能的targets是必要的。内核构建系统所支持的目标完整列表可由命令 "make help" 打印出来。这里仅简单的列出最重要的部分:<br />这里咱们先澄清一个观念。很多人认为内核构建系统仅仅是kbuild,其实不然。你由上面这些转载 2011-05-25 21:26:00 · 1094 阅读 · 0 评论 -
alloca 在栈上分配空间,在函数返回时,由于栈框的释放而自动释放
ALLOCA 章节:Linux 程序员手册 (3)<br />更新:2008-01-24<br /><br />到 易美翻译 翻译 本页<br />名字 alloca - 分配可以自动释放的内存 概要#include <alloca.h><br />void *alloca(size_tsize);描述alloca() 函数从调用者的栈桢上分配 size 个字节的空间。这个临时的空间会在调用 alloca() 的函数返回到它自身的调用者时自动释放。 返回值alloca() 函数返回一个指向被分配空间转载 2011-05-27 19:38:00 · 1347 阅读 · 0 评论 -
内核里如果有内存泄露,打桩的方法(来自zh-kernel,感谢原作者)
<br />另外想请教一下各位,内核里如果有内存泄露,请问各位有什么方法分析吗?<br /><br />你可以使用打桩的方法,具体如下:<br />例如你写的程序调用到了kmalloc函数,那你可以自己实现另外一个内存分配函数,比如叫stub_kmalloc,<br /> 然后用 #define kmalloc(x) stub_kmalloc((x), __FILE__, __LINE__)<br />这个宏替换掉程序中所有的kmallock,stub_kmalloc大致流程如下:<br /><br />s转载 2011-06-02 20:17:00 · 983 阅读 · 0 评论 -
一段自己打印自己的c程序
test.c #include #include extern char * _binary_test_c_start;int main(){ printf("%s", (char *)&_binary_test_c_start);} Makefile ALL:test.c objcopy -I binary转载 2011-06-16 21:28:00 · 420 阅读 · 0 评论 -
dlsym与-fPIC,以及objcopy
这两天做的工作当中,遇到了这样一个需求。在Linux环境下,要为一个daemon程序的一个动态库进行升级,不不打断这个daemon的运行。这个动态库的函数会被daemon的多个线程调用。在升级时,对于已经使用了这个动态库的线程要毫无影响,直到这样的线程再次调用动态库的API时,再使用新的动态库。换句话说,在升级时,新旧两个动态库可以同时被这个daemon的线程调用。 为了实现这个功能,毫无疑转载 2011-06-16 21:35:00 · 551 阅读 · 1 评论 -
对编译和链接的一点Hack
Linux中有一个小工具叫objcopy,它用于目标文件之间的拷贝和转换。我们可以利用它将一个普通文件转换为可以用于链接的目标文件。先创建一个内容为Hello,world的文本文件:$ echo ‘Hello,world’ > file然后用objcopy将其转为一个ELF格式的32位目标文件:$ objcopy -I binary -O elf转载 2011-06-16 21:51:00 · 765 阅读 · 1 评论 -
技巧:用 C 语言实现程序的多态性
王 广, 硕士研究生, 中国科学技术大学中国科学技术大学,硕士研究生;现于 IBM CDL ECM IM eForms TEAM 从事自动化测试相关工作。 简介: 使用面向对象的语言可以实现多态,并且在很大程度上降低了代码的复杂性。对于面向过程的 C 语言同样可以实现多态,本文将着重介绍 C 语言是如何实现多态的。<!---->本文的标签:转载 2011-06-28 20:35:00 · 337 阅读 · 0 评论 -
hash表
Hash表理解言归正传,哈希表又名散列表,其主要目的是用于解决数据的快速定位问题。考虑如下一个场景。 一列键值对数据,存储在一个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个个拿出来比较key啊,呵呵。 (key-value这样的数据,要恰当的选择ke转载 2011-07-15 22:09:31 · 466 阅读 · 0 评论 -
wait WNOHANG 僵尸进程
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。 而僵尸进程就是指:一个进程执行了exit系统调用退出,而其父进程并没有为它收尸(调用wait或wa转载 2012-03-29 20:28:16 · 107 阅读 · 0 评论 -
sengmsg()和recvmsg()的综合应用
在一般的socket实现的时候,通常是用参数的形式,将文件描述符(FD)传到子进程或者直接传到read()汉书中。不过如果想以Socket的形式,来传送FD的话,那就要用到sendmsg和recvmsg函数了。关键点,FD的值要通过msg.msg_control来传递的,千万别写到传输用的buff里面,那样做只是简单的传值,没有任何意义的。/*-----------------------转载 2010-01-12 20:48:00 · 605 阅读 · 0 评论 -
用GDB调试多进程程序
有一段时间没有写技术方面的东西了^_^。众所周知,GDB是Unix/Linux下调试程序的龙头老大,GDB功能强大,我们在平时多使用其一些最基本的功能,而且一般调试的都是单进程的程序。最近一个项目中的问题让我接触如何使用GDB调试多进程程序,更确切的是说调试调用fork的多进程程序。使用GDB最好的文档就是其名为Debugging with GDB的参考手册。手册中有一小章节提到了如何转载 2010-01-12 20:15:00 · 358 阅读 · 0 评论 -
小心库函数调用的'陷阱'(转)
下午一同事发现代码中的一处问题,问题的现象是这样的:这位同事调用了一部门基础库函数,当使用32位编译后,程序正常运行;而当使用64位编译后,系统运行dump core。让这位同事奇怪的是他所修改的程序中还有其他模块也使用了同样的基础库函数,为什么偏偏他这块儿出错呢?恰恰该程序的其他模块是我写的。该程序调用的基础库函数大致是这样的:typedef unsigned long my_size_转载 2010-01-12 20:08:00 · 263 阅读 · 0 评论 -
11.1.6 传递文件描述符的例子(1)
11.1.6 传递文件描述符的例子(1)本节中使用一个实例来介绍进程间传递文件描述符的例子。分为两个进程,进程A中打开一个文件描述符,通过消息传送的方式将文件描述符传递给进程B。1.进程A的代码进程A根据用户输入的文件名打开一个文件,将文件描述符打包到消息结构中,然后发送给进程B。01 #include sys/types.h> 02 #include sys转载 2010-01-12 20:44:00 · 490 阅读 · 0 评论 -
美妙的文件描述符传递(recvmsg sendmsg)
我们知道父进程在子进程被fork出来之前打开的文件描述符是能被子进程继承下来的,但是一旦子进程已经创建后,父进程打开的文件描述符要怎样才能传递给子进程呢?Unix提供相应的技术来满足这一需求,这就是同一台主机上进程间的文件描述符传递,很美妙而且强大的技术。想象一下我们试图实现一个服务器,接收多个客户端的连接,我们欲采用多个子进程并发的形式来处理多客户端的同时连接,这时候我们可能有两种想法:1、转载 2010-01-12 20:08:00 · 1861 阅读 · 0 评论 -
还是sscanf(重复)
用FUSE做一个简单的用户级文件系统,在路径解析的时候用到sscanf,很强大~~sscanf 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argum转载 2009-11-18 22:04:00 · 358 阅读 · 0 评论 -
sscanf sprintf 例子
sprintf与sscanf用法 sscanf和sprintf是scanf和printf家族的一对成员,用于处理和分析字符串非常强大得两个函数头文件 stdio.h原型int sscanf( const char *buffer, const char *format, ... );int转载 2009-11-17 21:22:00 · 1205 阅读 · 3 评论 -
3个学习Socket编程的简单例子:TCP Server/Client, Select
以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序。如果你能完全理解这3个例子,估计socket编程就已经基本入门了。 建议:1) 多多查查所用到的网络接口; 2) 最好有一本书,如UNIX环境高级编程,UNIX网络编程,可查询;3) 可以直接使用书上的例子更好。转载 2010-01-18 20:22:00 · 1469 阅读 · 0 评论 -
对各I/O模型写了对应Web服务应用模型(select poll)
//by lenky 利用select多路复用I/O的Web服务应用模型 /* 可读、可写、异常三种文件描述符集的申明和初始化。*/ fd_set readfds, writefds, exceptionfds; FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptionfds); i转载 2010-01-19 16:01:00 · 359 阅读 · 0 评论 -
va_start vsprintf 小例子
#include int print(char *fmt, ...){ va_list vl; char str[30]; va_start (vl, fmt); vsprintf (str, fmt, vl); va_end (vl); printf (str);}int main (){ print("-----%s--%s---", "haha", "hehe");}转载 2009-11-22 09:13:00 · 332 阅读 · 0 评论 -
perror 函数用法
语法: #include void perror( const char *str );函数说明 perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 错误 (stderr) 。参数 str 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量er转载 2009-11-29 21:33:00 · 708 阅读 · 1 评论 -
可以去掉文件绝对路径的printf debug
#define DEBUG(fmt, arg...) / printf ("[%s@%d] " fmt"/n", strrchr (__FILE__, /) == 0 ? / __FILE__ : strrchr (__FILE__, /) + 1, /转载 2010-02-02 16:21:00 · 830 阅读 · 0 评论 -
(转)ELF文件格式 程序加载 执行 图示 OBJDUMP
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE转载 2009-12-24 10:57:00 · 589 阅读 · 0 评论 -
(转)一个简单的带头尾指针单向链表(C实现)
用C写了一个带头尾指针的单向链表,仅在尾部进行插入操作,在任意位置进行删除操作。因为只用到这么些功能,又因为懒,所以没有扩展。因为插入是固定在尾部进行,带一个尾指针的好处是显而易见的。当然删除时要付出一些开销。 list.h ------------------------------------------- /* list.h ** Copyright 2004 Coon Xu. *转载 2010-03-03 16:54:00 · 611 阅读 · 0 评论 -
转:Before main() 分析(gdb的使用)
main()的堆栈内容演示。===========================================================预备知识:1. 常用命令(gdb) b * 0x80483d8 # 在地址处设置断点(gdb) b main # 在标号处设置断点(gdb) disass 0x80483d8 # 反汇编(gd转载 2009-12-28 20:40:00 · 672 阅读 · 0 评论 -
indent code style
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE原创 2010-01-11 11:17:00 · 296 阅读 · 0 评论 -
流程图
流程图(FlowChart)是描述我们进行某一项活动所遵循顺序的一种图示方法。它虽然并不统计学的范畴,但在很多质量专家仍把它纳入统计技术的范围之内,因为在质量管理的过程中,流程图是我们经常使用的一个工具。一个好的流程图可以直观地描述整个活动中所有过程的物流、信息流,让人很容易知悉整个过程。质量管理过程中常用的流程图有产品生产流程图、产品检验流程图、服务流程图等。在这里大家可以简单了转载 2010-01-11 14:19:00 · 2775 阅读 · 0 评论 -
Linux 上实现双向进程间通信管道(转)
问题和常见方法Linux 提供了 popen 和 pclose 函数 (1),用于创建和关闭管道与另外一个进程进行通信。其接口如下: FILE *popen(const char *command, const char *mode);int pclose(FILE *stream); 遗憾的是,popen 创建的管道只能是单向的 -- mo转载 2010-01-13 20:17:00 · 407 阅读 · 0 评论 -
wait WNOHANG 僵尸进程
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。 而僵尸进程就是指:一个进程执行了exit系统调用退出,而其父进程并没有为它收尸(调用wait或wa转载 2012-03-29 20:31:17 · 1566 阅读 · 2 评论