
C语言
Yang-Zheng
linux
展开
-
linux 下websocket server demo例程
websocket的协议,原理参考文档:http://www.2cto.com/kf/201210/161006.html。主要步骤:1、创建socket套接字进行监听客户端; 2、握手,当与客户端建立tcp连接后,客户端会发送websocket请求,此时,服务器端需要提取客户端在websocket请求中包含一个握手的唯一Key,服务端在拿到这个Key后,需要加入一个GUID,然原创 2017-08-22 17:28:50 · 8224 阅读 · 1 评论 -
warning: control reaches end of non-void function
用gcc编译一个程序的时候出现这样的警告:warning: control reaches end of non-void function它的意思是:控制到达非void函数的结尾。就是说你的一些本应带有返回值的函数到达结尾后可能并没有返回任何值。这时候,最好检查一下是否每个控制流都会有返回值。原创 2014-05-13 10:29:33 · 928 阅读 · 0 评论 -
"undefined reference to" 问题解决方法
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1. 链接时缺失了相关目标文件(转载 2014-05-13 10:33:17 · 1316 阅读 · 0 评论 -
消灭编译警告(Warning)
如何看待编译警告当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息。警告信息可能意味着程序中隐含的大错误,也可能确实没有问题。对于警告的正确处理方式应该是:尽可能地消除之。对于编译程序给出的每个警告都应该仔细分析,看看是否真的有问题。只有那些确实无问题的警告才能放下不管。说明:由于编译的警告各种各样,根本不可以一一罗列出来,下面只是列举出比较典型的一些警告转载 2013-12-19 20:42:24 · 2358 阅读 · 0 评论 -
C的|、||、&、&&、异或、~、!运算
位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。位运算符有: &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。 其中,按位取反运算符是单目运算符,其余均为双目运算符。 位运算符的优先级从高到低,依次为~、&、^、|, 其中转载 2013-12-30 19:44:29 · 798 阅读 · 0 评论 -
writel()和readl()函数的作用
writel() 往内存映射的 I/O 空间上写数据,wirtel() I/O 上写入 32 位数据 (4字节)。 原型:#include void writel (unsigned char data , unsigned short addr )readl() 从内存映射的 I/O 空间读取数据,readl 从 I/O 读取 32 位数据 ( 4 字节 )。原型:#inclu原创 2013-12-16 15:06:16 · 5242 阅读 · 0 评论 -
__FILE__,__LINE__,FUNCTION__实现代码跟踪调试
先看下简单的初始代码:注意其编译运行后的结果。root@xuanfei-desktop:~/cpropram/2# cat global.h //头文件#ifndef CLOBAL_H #define GLOBAL_H #include int funca(void); int funcb(v转载 2013-12-30 10:48:09 · 735 阅读 · 0 评论 -
十条不错的编程观点
酷壳:http://CoolShell.cn 原文:http://coolshell.cn/?p=2424 在Stack Overflow上有这样的一个贴子《What’s your most controversial programming opinion?》,翻译成中文就是“你认为最有争议的编程观点是什么?”,不过,在400多个主回贴,以及千把个子回贴中,好像并不是转载 2013-12-15 18:46:13 · 560 阅读 · 0 评论 -
面试题目
LinkList *reverse(LinkList *head){ LinkList *p1,*p2 = NULL,*p3 = NULL; if(head == NULL || head->next == NULL) return head; p1 = head->next; while(p1!=NULL) { p3 = p1->next;转载 2013-10-21 22:08:36 · 786 阅读 · 0 评论 -
GUI框架
既然我们上文中提到了当前最主流的交互方式就是图形化交互,我们就来看看图形用户界面的基本结构。现在普遍的系统上都会有一个应用程序框架,而这类框架都会提供一个GUI(Graphics User Interface),有了GUI,作为应用程序的普通开发者就不需要去关注如何去监听用户的事件,如何去调度各个程序之间的窗口(窗口直接的覆盖,隐藏,激活,调度等),窗口的绘制,图形的绘制,等等。 一个典转载 2014-08-07 18:55:41 · 1009 阅读 · 0 评论 -
结构体中的冒号:位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来转载 2014-08-13 11:26:54 · 736 阅读 · 0 评论 -
如何在uboot中添加驱动程序
Author:杨正date:2016.9.21目的在u-boot中添加驱动程序。 详细举例介绍在uboot中操作寄存器,实现对gpio及外围设备的控制有两种方法,一种是直接在arch/arm/lib/board.c中添加对寄存器的操作代码,如:#define muxctrl_reg5 0x200f0014#define GPIO6_DIR 0x201a0400原创 2016-10-14 17:36:57 · 9875 阅读 · 0 评论 -
函数参数的传递问题(指针的指针)
程序1:void myMalloc(char *s) //我想在函数中分配内存,再返回{ s=(char *) malloc(100);}void main(){ char *p=NULL; myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么? if(p) free(p);}转载 2016-09-09 14:57:26 · 1474 阅读 · 0 评论 -
在linux中用C语言实现ping命令
运用C语言编写模拟常用网络命令ping命令实现一个基于linux原始套接字和ICMP协议的ping程序。该程序能用于检测主机或路由器工作是否正常。程序中主要的函数void alarm_handler(int); /*SIGALRM处理程序*/void int_handler(int); /*SIGINT处理程序*/void set_sighandler(); /*设原创 2016-01-27 13:57:17 · 10332 阅读 · 8 评论 -
在ARM Linux下使用GPIO模拟SPI时序详解
Author:杨正 Data:2016.1.1 Mail:yz2012ww@gmail.com一、 概述SPI是英文SerialPeripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速、全双工、同步通信总线,标准的SPI有4个引脚,常用于单片机和EEPROM、FLASH、实时时钟、数字信号处理等器件的通信。SPI通信原理要比I2原创 2016-01-06 18:44:08 · 19499 阅读 · 1 评论 -
fork产生子进程利用pipe管道通信
转载链接:http://hi.baidu.com/hj11yc/item/9a2ea30cca773077bfe97efc注:加了一点内容进程间通信 fork pipe pie_t 等用法(管道机制 通信)每个进程各自有不同的用户地址空间,任 何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到转载 2015-12-16 10:29:20 · 2528 阅读 · 0 评论 -
linux中fork()函数详解
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来转载 2015-12-16 09:32:18 · 1083 阅读 · 0 评论 -
STRTOK函数和STRTOK_R函数
注:本文转载自博客园,感谢作者整理!1.一个应用实例网络上一个比较经典的例子是将字符串切分,存入结构体中。如,现有结构体typedef struct person{ char name[25]; char sex[10]; char age[4]; }Person;需从字符串 char buffer[INFO_MAX_SZ]="Fred ma转载 2015-10-28 09:59:58 · 621 阅读 · 0 评论 -
在Linux下调试信息输出自定义颜色字体
Date:2015.5.15 Author:杨正 QQ:1209758756yz2012ww@gmail.com 在Linux环境下进行软件开发时,调试是经常做的事情,为了让调试信息更加清晰方便,这里讲解如何输出带有自定义的颜色字体,比如可以自定义输出颜色为红,绿,蓝等,与其他打印信息区分开来。 首先讲解在shell脚本中的应用:在she原创 2015-05-18 13:58:04 · 2437 阅读 · 0 评论 -
用GDB调试程序
GDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可转载 2013-12-15 19:01:48 · 714 阅读 · 0 评论 -
Linux内核zImage\Image\uImage之区别及uImage的制作
一、Image、zImage和uImage的区别内核编译(make)之后会生成两个文件,一个是Image,一个是zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。uImage是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0转载 2014-11-20 11:05:55 · 2284 阅读 · 0 评论 -
浅谈段错误
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决。1. 段错误是什么一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,转载 2013-10-26 20:54:42 · 757 阅读 · 0 评论 -
结构体对齐
编译器是按照什么样的原则进行对齐的?成员对齐有一个重要的条件:即每个成员按自己的方式对齐。其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐。并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节。每个成员的起始地址%每个成员的自身对齐值=0,否则补空直至满足条件。先让我们看四个重要的基本概念:1.数据转载 2013-09-08 13:58:29 · 550 阅读 · 0 评论 -
在C语言中各种类型数据所占字节数
和机器字长及编译器有关系:所以,int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位。 unsigned 是转载 2013-08-26 17:00:09 · 3503 阅读 · 0 评论 -
#define中的UL
c语言 #define 中的ULU和L是 整数文字量的后缀修饰,用于显示指明整数文字量的类型为unsigned int(U)和long int(L)。 类似的还有浮点数文字量的后缀修饰F或f,用于指明文字量表示的是一个float,而不是默认情况下的double。经常发现一些C语言中通过#define 定义的数据中包含有UL符号,不理解为什么,把他去掉发现也没有什么区别。现在才明转载 2013-08-23 16:22:58 · 3961 阅读 · 1 评论 -
一个参数既可以是volatile又可以是const吗?
volatile修饰符告诉complier变量值可以以任何不被程序明确指明的方式改变,最常见的例子就是外部端口的值,它的变化可以不用程序内的任何赋值语句就有可能改变的,这种变量就可以用volatile来修饰,complier不会优化掉它。const修饰的变量在程序里面是不能改变的,但是可以被程序外的东西修改,就象上面说的外部端口的值,如果仅仅使用const,有可能complier会优化掉这原创 2013-08-23 15:34:04 · 4026 阅读 · 0 评论 -
C 语言中强制类型转换
C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。例如,定义如下:int a;float b;double转载 2013-08-02 16:37:01 · 949 阅读 · 0 评论 -
sprintf函数的用法
1、该函数包含在stdio.h的头文件中。#include 2、sprintf与printf函数的区别sprintf和平时我们常用的printf函数的功能很相似。sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。3、sprintf函数的格式:int sp原创 2013-08-02 15:18:06 · 1314 阅读 · 0 评论 -
vim 的高级应用
一、ctags应用ctags(Generate tag files for source code)是vim下方便代码阅读的工具。尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。Linux下VIM简单易用,大家只要看看VIM自带的vitutor,大约只要20分钟就能掌握VIM的用法。但是对于Linux下的原创 2013-08-02 14:39:11 · 1106 阅读 · 0 评论 -
结构体 数组名与指针的区别
A、数组名不是指针。B、数组名 是 不是指针的指针。数组名本质: (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组; (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量; (3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!解析:A ch转载 2013-08-15 15:47:09 · 2013 阅读 · 0 评论 -
assert的用法
MSDN里是这样描述ASSERT宏的:ASSERTASSERT( booleanExpression )ParametersbooleanExpressionSpecifies an expression (including pointer values) that evaluates to nonzero or 0.RemarksEvaluates its argu原创 2013-09-15 10:55:08 · 865 阅读 · 0 评论 -
堆栈与函数调用
1) 在栈上创建。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。2) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵转载 2013-09-09 20:10:00 · 1133 阅读 · 0 评论 -
windows 下使用vim
相信只要接触过linux的人肯定用过vim这个功能超强大的文本编辑器,只要在linux写过C语言的绝对使用了gcc的,我接触linux没多长时间,但是觉得这两个东西真的是相当的好,如果写一个简单的C语言程序每次都要打开虚拟机是不是很麻烦呢?可以在windows下使用vim和gcc来开发C语言程序吗?还真的可以。1. 准备vim这个编辑器。在windows下有一个很优秀的gVim文本编辑器,翻译 2013-09-07 20:08:57 · 1495 阅读 · 0 评论 -
数组结构体
数组定义:数组是有序的并且具有相同类型的数据的集合。一维数组1、一般形式:类型说明符 数组名[常量表达式];例如: int a[10]; 元素为a[0]----a[9].2、常量表达式中不允许包含变量,可以包含常量或符号常量。3、数组元素下标可以是任何整型常量、整型变量或任何整型表达式。4、可以对数组元素赋值,数组元素转载 2013-08-16 19:12:10 · 1486 阅读 · 0 评论 -
c 中一些指令
# 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下面代码 #elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif 结束一个#if……#else原创 2013-08-28 16:19:53 · 545 阅读 · 0 评论 -
结构体对齐
关于C语言中的结构体对齐。 (1)什么是字节对齐 一个变量占用 n 个字节,则该变量的起始地址必须能够被 n 整除,即: 存放起始地址 % n = 0, 对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个。 (2)为什么要字节对齐 内存空间是按照字节来划分的,从理论上说对内存空间的访问可以从任何地址开始,但是在实际上不同架构的CPU为了提高访问内存的速度,原创 2013-08-26 17:02:35 · 533 阅读 · 0 评论 -
漫谈C语言及如何学习C语言
好文章啊,值得一看!!!!! http://sunxiunan.com/?p=1661 云风最近写了一篇博客《C语言的前世今生》。作为长期使用C语言开发网络游戏服务器的程序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C语言在业界使用的现状没有怎么描写,有些意犹未尽。在这里想比较系统的谈谈个人对C语言学习方式方法的理解。分别按照书籍、实验环境搭建、网络资源来分别转载 2013-08-01 15:58:57 · 1432 阅读 · 1 评论