- 博客(46)
- 资源 (3)
- 收藏
- 关注
转载 单链表的一些常见题目
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?解答:一、判断链表是否存在环,办法为:设置两个指针(fast
2011-09-18 22:05:21
600
原创 programmer是我的归路吗?
在学校,或者社会上,对程序员的议论总是有的。我们自己时不时的会自嘲,或者讥讽那些所谓的IT民工。因为以前也没去真正的实践过,所谓觉知此事须躬行,确实是这个道理。从软件公司实习回来,我必须说实话,而且我自己也打消了疑虑。以前经常会问我自己,自己到底适不适合搞技术,搞技术能不
2011-09-14 12:06:06
735
转载 linux内核SMP负载均衡浅析
需求在《linux进程调度浅析》一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列)。如果一个进程处于TASK_RUNNING状态(可执行状态),则它会被加入到其中一个run_queue(且同一时刻仅会被加入到一个run_queue)
2011-08-12 18:04:47
6085
原创 递归遍历目录下的文件
关于目录文件的分析/lib/src/vim/,lib,src,都是目录文件,而vim是普通文件 -------------------opendir() 返回一个DIR *--------->readdir(DIR *) 返回一个dirent 结构的指针struct diren
2011-07-08 10:00:03
1012
原创 待处理信号的处理方式
在unix的SIGINT信号由内核发送给用户进程,而此时正在执行有sigint触发的信号处理程序,那么此信号会被阻塞。如果仅此而已,unix可以正确处理。但若此时又有一个sigint信号被投送到此用户进程,那么这个信号会被简单的丢弃,并不会排队。 在编写信号处理程序的时候通常容易忽略这点: 常见的错误是这样的:void handler2(int sig) {
2011-06-23 18:00:00
1139
原创 别忘了--要处理被中断的系统调用
一般慢速系统调用基本规则是:当阻塞于某个慢系统系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能要返回ENINTR错误。 问:linux会重启某些被中断的系统调用吗? 处理的例子:for( ; ;) { if (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
2011-06-23 16:59:00
729
原创 STL中的iterator adapter
以ostream_iterator 来说,下面是从vc++摘取的:template<class _Ty, class _Elem = char, class _Traits = char_traits > class ostream_iterator : public _Outit { // wrap _Ty inserts to output stream as out
2011-06-23 14:43:00
577
原创 转载:在Linux平台中调试C/C++内存泄漏方法
<br />以下转自IBM<br /> <br /> 韩兆兵 (hanzb@cn.ibm.com), 软件工程师, IBM<br /> <br />刘盈 (cdlliuy@cn.ibm.com), 软件工程师, IBM<br /> <br />强晟 (qiangsh@cn.ibm.com), 软件工程师, IBM 2008 年 5 月 15 日<br /> <br /> <br /> <br />由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导
2011-05-22 23:22:00
1159
原创 关于宏
<br />#define ADD_TO_SUM( sum_number, value) /<br /> sum##sum_number += value<br />.................<br /> <br />ADD_TO_SUM(5, 25) ===> sum5 += 25;<br /> <br />##把位于它两边的符号连接成一个符号。作为用途之一,它允许宏定义从分离的文本片段创建标识符。
2011-04-01 16:22:00
394
原创 linux系统的平均负载
<br />哥今天被面试官问到了,唉,只憋出来个top,而且还不知道load average<br />1,平均负载是什么? 特定时间间隔内运行队列中的平均进程数,好象还不够明白:就是进程队列的长度,有多少个进程在排队等待运行2,什么是"进程队列"? 一个进程满足以下条件就会位于进程队列中 1,它没有在等待I/O操作的结果 2,它没有主动进入等待状态(即没有调用wait)
2011-03-31 20:36:00
424
原创 linux中的线程和信号
<br />linux线程是以独立进程实现的,是用clone共享资源。因此linux线程在遇到信号时的行为与其他操作系统实现不同。在posix.1线程模型中,异步信号被发送到进程以后,进程中当前没有阻塞该信号(如设置了屏蔽位sigprocmask(&oldmask, &newmask))的某个线程就被选中,接收信号。<br />而在linux上异步信号发送到“特定”的线程(如pthread_kill(thread, signo),而且因为每个线程是作为独立的进程执行的,系统就不能选择当前没有阻塞该信号的线程
2011-03-18 12:04:00
654
原创 我所忽略的c 语言标准
1.表达式中有无符号数和有符号数混用的时候先看一个例子:int main(void){unsigned int a = 6;int b = -20return (a+b) > 0 ? 1 : 0;}echo $ 的结果是 1。首先这两个数在内存中都是以补码形式存储的,以上面的例子分别为0xffffffec , 0x6。相加后的值也很明显等于fffffff2可以看一下gcc中反汇编:0: 8d 4c 24 04 lea 0x4(%esp),%ecx
2011-03-08 15:24:00
481
原创 设备驱动程序p57
<br />内核中的struct file{}结构,与用户空间中c库的FILE没有任何关联。<br />struct file { /* * fu_list becomes invalid after file_free is called and queued via * fu_rcuhead for RCU freeing */ union { struct list_head fu_list; struct rcu_head fu_rcuhead; } f_
2011-03-08 14:27:00
614
原创 windows DLL那些事儿
在windows下常见的动态链接库文件:.DLL, .ocx, .CPL dll与exe都是PE格式的二进制文件,只是PE头部的一个符号位来表示是exe或者是dlldll的共享数据段------为了实现进程通信。但是为了安全起见,一般不使用共享数据段。DLL中导出,导入机制:关于符号的导入,导出在编程时常用的几种办法:1.程序中定义函数或者变量时候,用下面的c/c++扩展来修饰使用_declspec(export) 函数名或者变量 _declspec(import) 函数名或者变量2.使用模块
2011-02-27 22:52:00
1505
原创 PE
<br />PE里面常见的术语:<br />RVA :relative virtual address 相对虚拟地址,是相对于PE文件的装载基地址的一个偏移地址.<br /> <br /> <br />基地址: BASE address,PE文件装载时候都有一个装载目标地址(Targe Address)<br />而RVA就是基于BASE address 相对地址<br /> <br /> <br />装载一个PE可执行文件的过程:<br />1.读取文件的第一个页,获取dos 头,PE的文件头,段表<br
2011-02-27 11:11:00
722
原创 关于.bss段的讨论,全局未定义变量和未定义的局部静态变量
<br />由《程序员的自我修养》给出的例子:<br />/*SimpleSection.ctest the coff obj's structureauthor:wuyichaodate: 2011-2-26*/int printf( const char* format,... );int global_var; ///并没有放到.bss段里面,由符号表里看而是放到了.data段中,与elf有区别void func1(int i){ printf("%d/n
2011-02-26 22:49:00
2894
原创 数组和指针可交换性的讨论
一、数组和指针是有区别的。若存在这种情况,file1:int age[100]; file2:extern int *age; 这样,对age声明与定义出现了二义性,编译器会报错。 c语言标准作出说明:规则 1.表达式中的数组名(与
2011-02-25 13:45:00
1160
原创 使用gcc 窥探 可执行产生过程
<br />还是最简单的helloworld.c来分析<br />#include <stdio.h>int main(void){ printf("hello world!");} <br />通常我们默认这样产生可执行文件 gcc hello.c -o hello<br /> <br />拆分为4个步骤:<br />1.预处理<br />gcc -E hello.c -o hello.i 生成中间文件后缀 为 .i的文件 <br />2.编译 <br />gcc -S
2011-01-05 21:59:00
544
原创 添加内核模块之入门helloworld.ko
首先 是从一个西邮学生看到的,比较好的入门方式:首先是hello.c的文件:主要要说明对内核的编程只能使用内核头文件,所以通常我们都使用makefile来控制编译过程#include "linux/init.h"#include "linux/module.h"#include "linux/kernel.h"//必选//模块许可声明MODULE_LICENSE("Dual BSD/GPL");//模块加载函数static int hello_init(void){
2011-01-05 21:45:00
3689
原创 转intel汇编和AT&T汇编的区别
<br />因为在linux的内核中,很多跟底层硬件接触的都使用汇编语言,但是Linux不仅使用一种汇编语言,除了Intel的汇编语言之外,还是用AT&T的汇编语言,因此可以说这两个是一个基础,Intel的汇编相信很多学计算机的人都学习过,但是AT&T的就不一定了,个人认为他们的思想都是一样的,只不过是语法不同,初级学习可以看如下的文章(文章转自http://blog.chinaunix.net/u1/59572/showart_1148334.html)<br />一、AT&T 格式Linux 汇编语法格
2010-12-19 00:36:00
1735
原创 c++ model
2010-11-13 c++对象模型中,Nonstatic data members 被配置于每一个class object之内,static data members 则被存放在所有的class object之外。static 和 nonstatic funtion members也被放在所有的class object 之外。2010-11-27构造语义学:default constructor:copy constructor的建构操作:member class object 成员类对象一个class
2010-12-19 00:32:00
681
原创 c++ 中的explicit
<br />explicit 之所以被导入这个语言,就是为了提供程序员一种方法,使得他们能够制止“单一参数的constructor"被当成是一个conversion运算符。<br />qt里面定义QPushButton的例子:<br />class Q_GUI_EXPORT QPushButton : public QAbstractButton<br />{<br /> Q_OBJECT<br /><br /> Q_PROPERTY(bool autoDefault READ au
2010-11-25 15:12:00
440
原创 对宏的使用的理解
<br />#define name(parameter-list) stuff<br />注意:参数列表的左括号必须与name相邻。如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。<br />对于#define 替换也有很多诡异的地方,有的时候会让人很费解。<br /> <br />解析步骤:<br />1.<br />2.<br />3.<br /> <br />宏参数和#define 定义可以包含其他#define 定义的符号。但是,宏不可以出现递归。<br /> <br />
2010-11-15 17:56:00
484
原创 fork 机制辨析(转自cnblog)
给出如下C程序,在linux下使用gcc编译: 要求如下: 已知从这个程序执行到这个程序的所有进程结束这个时间段内,没有其它新进程执行。 1、请说出执行这个程序后,将一共运行几个进程。 2、如果其中一个进程的输出结果是“pid1:1001, pid2:1002”,写出其他进程的输出结果(不考虑进程执行顺序)。 明显这道题的目的是考察linux下fork的执行机制。下面我们通过分析这个题目,谈谈linux下fork的运行机制。 预备知识 这里先列出
2010-11-14 22:26:00
848
原创 面试算法题(转自cnblog)
<br />Problem 1 : Is it a loop ? (判断链表是否有环?)<br /> Assume that wehave a head pointer to a link-list. Also assumethat we know the list is single-linked. Can you come up an algorithm to checkwhether this link list includes a loop by using O(n) time and O(1)
2010-11-14 20:33:00
1976
原创 c测试环境属性
<br />达到可移植性的目的,很多c code都要使用预编译指令来测试环境属性,然后让自己编写的程序来适应当前环境。<br /> <br /> <br />测试机器的大小端:<br />比较容易接收的有下面这种:<br />int x = 1;<br /> <br />if(*(char *)&x == 1)<br /> printf("little endian");<br />else<br /> printf(" endian“);<br /> <br /> <br /> <br />
2010-11-13 13:04:00
349
原创 数组和数组名取址的区别(转自windflush.cn/blog)
起因是Expert C Programming的一道习题:#include char ga[14] = "abcdefghijklm"; void my_array_func(charca[10]){ printf(" addr of array param = %#x /n",&ca); printf(" addr (ca[0]) = %#x /n",&(ca[0])); printf(" addr (ca[1]) = %#x /n",&(ca[1])); printf(" ++ca =
2010-11-09 15:30:00
608
转载 经典的c语言测试题
<br />绝对能够测试你的C语言功力的几个问题!<br />很少有真正精通了C语言编程的学员,一般都有或多或少概念不是完全清楚的问题,特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义指向函数的指针类型,这也是导致学习C困难的一个原因。下面有几个简单测试将能发现你对C语言的掌握情况。<br />1)int x=35;<br /> char str[10];<br />//问:strlen(str)和sizeof(str)的值分别是多少?<br />答:strlen(str
2010-10-30 09:55:00
462
原创 关于声明()和定义的认识
<br />声明:declaration<br />定义:definition<br />声明一个变量:<br />如extern int a;<br /> <br />定义一个变量:<br />int a=0; 分配了内存,并赋予了名字,和内存的初始的内容0x00<br /> <br />若是在函数外部使用,extern int a = 1;而且也只有在函数体外部才可以这样使用extern.在函数体内部只能写extern int a;<br />这是定义+声明<br /> <br />而在函
2010-10-29 17:03:00
329
原创 关于static, register, volatile,auto 变量的比较
<br />在unix环境编程中,setjump(),和longjump支持不同函数间的跳转。<br /> <br />在测试程序的比较下面<br />static<br />register<br />volatile<br />auto
2010-10-29 16:16:00
485
原创 一些基础的算法题(面试)
<br />部分IT公司笔试算法题<br /> 个人总结,算法未必最合理,仅供参考: shayg@163.com<br />1、将一整数逆序后放入一数组中(要求递归实现)<br />void convert(int *result, int n) {<br /> if(n>=10)<br /> convert(result+1, n/10);<br /> *result = n%10; <br />}<br
2010-10-29 15:52:00
3456
1
原创 一些url和参考书籍
http://kb.cnblogs.com/page/76197/http://www.sgi.com/tech/stl/ISO-99 programming languages-C : http://www.vmunix.com/~gabor/c/draft.html#1编译器牛人的主页:http://www.walterbright.com/
2010-10-15 22:58:00
2688
原创 关于extern "c"的写法
#ifndef _ _INCvxWorkSh#define _ _INCvxWorkSh#ifdef _ _cplusplusextern "c"{#endif" 。。。。。。 "(内容 在c++语言中要引用c语言中的函数或者变量)这里面可以包含 c 语言的头文件如:#include" header.h")在c++程序中便可以使用头文件里面的东西。#ifdef _ _cplusplus}#endif这是一个extern " c"很好的例子。在编译实现的头文件里面经常会碰到。
2010-10-15 22:37:00
737
原创 关于void main(void)的错误
<br />在x86+windows环境下,或许许多处理器和操作系统环境这样写,都没有问题。<br />虽然我一直知道,<br />int main(void) {<br />return 0;<br />}<br />int main(int argc,char**argv)<br />{<br />return 0;<br />}<br />这种写法是c99标准里面规定的。<br />但我不知道为什么会是这样。<br />所以经常也时常写成void main(void)<br /> <br />但是从可
2010-10-15 22:19:00
3752
原创 inline的正解
<br />关于inline ,以前没能认识清楚。牵扯到编译器的一些问题。内联函数在把函数代码替换到条用他{}规定域。<br />而且能知道的是,这样的,在第一次定义一个 inline void foo(){<br /> <br />}之后,如果后面还要在其他域中定义相同名字,相同修饰符号的内联函数的时,一般都定义为相同的 function body<br />即使你不那样定义,在vs2005中,编译器也是这么认为的,在编译的时候,把第一个 解析到的inline void foo()作为一个判决,以后都以这
2010-10-14 22:53:00
309
原创 堆栈帧 stack frame
<br /> stack frame堆栈中的一个区域,函数在那里存储变量和其他值。<br /> funtion----<br /> --prologue 函数序(自己的翻译:函数的开场白<br /> <br /> --body 函数体 (<br /> --epilogue 函数跋 (函数的收场白<br />外部名字的最终限制是链接器施加的。<br /> <br />堆栈帧的布局:<br />堆栈帧的组织形式,调用和
2010-10-13 23:37:00
701
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人