C++/C
文章平均质量分 76
明潮
这个作者很懒,什么都没留下…
展开
-
细谈select函数(C语言)
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式转载 2017-10-18 13:40:19 · 235 阅读 · 0 评论 -
socket编程之accept()函数
名称accept()接收一个套接字中已建立的连接使用格式#include sys/types.h>#include sys/socket.h>int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);功能参数描述accept()系统调用主要用在基于连接的套接字类型,比如SOCK_STREAM和转载 2017-10-18 19:28:35 · 26016 阅读 · 0 评论 -
pthread_create函数
原型:int pthread_create((pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) 用法:#include 功能:创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。 说明:th转载 2017-10-18 19:30:02 · 426 阅读 · 0 评论 -
串口通信——接收串口数据并处理(C语言)
本文主要内容包含: 1.接收串口数据程序的编程逻辑示意图; 2.接收串口数据程序要用到的通用函数模块(可直接引用,无需更改); 3.接收串口数据程序的示例。1.接收串口数据程序的编程逻辑示意图:2.与串口有关的函数模块及数组(可直接引用到自己的程序中)://设置波特率函数会用到的数组int speed_arr[] = { B38400, B1920转载 2017-10-27 14:46:15 · 13299 阅读 · 0 评论 -
IO多路复用之poll总结
1、基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。2、poll函数 函数转载 2017-10-27 15:13:34 · 176 阅读 · 0 评论 -
IO多路复用之epoll总结
1、基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。2、epoll接口 epoll操作过程需要三个接口,分别如下:#inclu转载 2017-10-27 15:14:55 · 155 阅读 · 0 评论 -
select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用转载 2017-10-27 15:17:06 · 163 阅读 · 0 评论 -
IO多路复用之select总结
1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。转载 2017-10-27 15:11:31 · 205 阅读 · 0 评论 -
正确使用memset函数
本文归纳了下使用memset几个需要注意的地方,虽然内容很简单,但也希望对大家有所帮助。1. memset是以字节为单位,初始化内存块。当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,[cpp] view plain copyprint?char data[10]; memset(data转载 2017-10-20 09:37:47 · 359 阅读 · 0 评论 -
memcpy的用法总结
1、memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;函数原型:void *memcpy(void *dest, void *src, unsigned int count);用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可转载 2017-10-20 11:40:33 · 1605 阅读 · 0 评论 -
Linux的sleep()和usleep()的使用和区别
函数名: sleep 头文件: #include // 在VC中使用带上头文件 #include // 在gcc编译器中,使用的头文件因gcc版本的不同而不同 功 能: 执行挂起指定的秒数 语 法: unsigned sleep(unsigned seconds);示例: #include #include int main() {转载 2017-10-20 14:20:49 · 789 阅读 · 0 评论 -
LeetCode总结
最近完成了www.leetcode.com的online judge中151道算法题目。除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解题目算法数据结构注意事项Clone GraphBFS哈希表Word Ladder IIBFS哈希转载 2017-10-28 13:15:11 · 201 阅读 · 0 评论 -
C语言标准库函数qsort排序的介绍与使用
qsort函数包含在的头文件里。qsort函数声明如下:void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));参数说明如下:base: 要排序的数组nmemb: 数组中的元素数目size: 每个数组元素占用内存空间,可使用sizeof获得co转载 2017-10-28 17:25:37 · 6017 阅读 · 0 评论 -
c++源文件 不同后缀(.cc .cpp .C .cp)的区别
参考了C++ Primer Plus第五版中文版 P8C++实现 源代码的扩展名UNIX C、cc、cxx、cGNU C++ C、cc、cxx、cpp、c++Borland C++ CppMicros转载 2017-10-28 17:39:30 · 32519 阅读 · 1 评论 -
c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子。1.1结构体成员指针未初始化 ?1234567891011struct student{ char*name; intscor转载 2017-11-07 13:37:32 · 278 阅读 · 0 评论 -
struct timespec 和 struct timeval
time()提供了秒级的精确度 .1、头文件 2、函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在的秒数 用time()函数结合其他函数(如:localtime、gmtime、asctime、ctime)可以获得当前系统时间或是标准时间。如果需要更高的时间精确度,就需要struct timespec转载 2017-11-07 14:13:22 · 334 阅读 · 0 评论 -
clockid_t与clock_gettime 函数
clockid_tkernel的time基本类型:1) system timeA monotonically increasing value that represents the amount of time the system has been running. 单调增长的系统运行时间, 可以通过time source, xtime及wall_to_monotonic计算出来.原创 2017-11-07 14:48:54 · 4495 阅读 · 3 评论 -
串口异步收发的实现--蓝牙遥控车的控制
背景实习时做的一个预研项目的一部分。做完之后收获还是挺多的,虽然收获的前提是被坑的很惨很惨。。。。 代码地址 https://github.com/Wujh1995/Asynchronous-Serial-Read-Write用串口下发数据,控制机器人底盘履带转动;同一个串口接收下位机上送的码盘数据,获得机器人实时信息;上送/下发的数据格式用协议的形式固定;由于下位机不定时上送转载 2017-10-30 13:34:37 · 726 阅读 · 0 评论 -
Linux串口通信中一种接收不到数据的问题的解决
转载来源:嵌入式系统之初学者点滴 (百度空间)原文在这篇文章()中,实现了Linux环境下的串口读写操作,程序也运行成功了。但是再进一步测试时发现,如果开机之后直接如上文中所说,分别运行读程序和写程序,再用导体同时触碰串口的2、3针的话。此时将显示写入串口成功,但是读串口数据失败。这个奇怪的问题当时之所以没有被发现出来,是因为在这之前,曾经打开过一次minicom。后来实验转载 2017-10-30 15:08:05 · 5596 阅读 · 4 评论 -
C语言实现hashmap,安卓系统AOSP源码
HashMap.h#ifndef __HASHMAP_H#define __HASHMAP_H#include "ESR_ReturnCode.h"#include "ESR_SharedPrefix.h"#include "ptypes.h"#include typedef struct HashMap_t{ ESR_ReturnCode(*put)(str原创 2017-11-07 20:16:44 · 768 阅读 · 0 评论 -
C语言字符串函数大全及范例
函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例:#include #include int main(void) { char string[10]; char *str1 = "abcdefghi"; stpcpy(stri原创 2017-10-30 17:44:46 · 550 阅读 · 2 评论 -
SecureCRT串口工具常用设置
1. SecureCRT工具默认无法使用键盘上的Home和End等按键,可以通过如下设置修改:在securecrt界面:工具→键映射编辑器,在弹出的键盘中点击“home”,会弹出一个窗口,在“发送字符串”中输入:\033[1~另存为securecrt安装根目录下的Keymaps目录里即可,后缀是key结尾的文件,例如我的是home.key。用编辑器打开home.key文件,依次修改如下转载 2017-10-30 18:06:37 · 3826 阅读 · 0 评论 -
POSIX多线程编程-条件变量pthread_cond_t
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线承间的同步。 1.转载 2017-10-30 19:10:42 · 299 阅读 · 0 评论 -
【Linux C 多线程编程】互斥锁与条件变量
一、互斥锁互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。 1. 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init. 对于动态分配的互斥量, 在申请内存(mal转载 2017-10-30 19:14:15 · 335 阅读 · 0 评论 -
do {...} while (0) 在宏定义中的作用
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子:?12#define __set_task_state(tsk, state_value)转载 2017-11-08 13:32:11 · 233 阅读 · 0 评论 -
C语言char*字符串数组和unsigned char[]数组的相互转换
#include #include using namespace std;void convertUnCharToStr(char* str, unsigned char* UnChar, int ucLen){ int i = 0; for(i = 0; i < ucLen; i++) { //格式化输str,每unsigned char 转换字符占两位置%x写输%X写输转载 2017-10-26 19:21:14 · 23947 阅读 · 0 评论 -
C/C++ memmove与memcpy的区别及实现
1.与字符串函数strcpy区别:memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。2.函数说明: memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址转载 2017-10-23 16:30:42 · 510 阅读 · 0 评论 -
junit
在android的开发的过程中,经常需要对业务方面的代码进行测试,熟悉java的人都知道junit,在android中google提供了基于junit为android进行了优化得自动化框架junit。在java中使用junit编写测试用例,我们需要继承TestCase,在android中需要继承AndroidTestCase。下面使用例子说明:我们有如下的业务类:[java]转载 2017-10-31 15:37:04 · 171 阅读 · 0 评论 -
浅谈C/C++数组取地址
我们先来看以下一段代码:1 #include2 using namespace std;3 int main(){4 int array[6] = { 1,2,3,4,5,'\0'};5 coutendl;6 coutendl;7 return 0;8 }我定义了一个长度为6的int型数组(注意,如果你要亲自试一试,不要用cha转载 2017-10-23 17:58:26 · 3329 阅读 · 0 评论 -
使用bsd的queue.h实现简单队列
队列是c中经常需要使用的数据结构,写一个0bug的队列header对于将来的代码复用很有用。 我选择使用bsd实现的队列结构,一是因为它实现简单,一个头文件里全是宏定义,二是因为它是BSD协议,代码可以随便用。 在linux下,在里定义了五个数据结构,分别是simple linked list, list, simple queue, tail queue和circuled que转载 2017-11-09 16:26:06 · 882 阅读 · 0 评论 -
C语言数据结构之间的区别
未完待续。。。char 与 unsigned char的区别在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有转载 2017-10-24 17:45:34 · 1173 阅读 · 0 评论 -
char *a 和char a[] 的区别(指针和数组的区别)
在C/C++中,指针和数组在很多地方可以互换使用,这使得我们产生一种错觉,感觉数组和指针两者是完全等价的,事实上数组和指针是有很大的区别的。1.两者在含义上的区别。 数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时转载 2017-10-16 19:01:37 · 410 阅读 · 0 评论 -
int ,long , long long类型的范围
int ,long , long long类型的范围类型最小值 最大值unsigned int04294967295 (2^32 - 1)int-2147483648 2147483647 (2^31 - 1)unsigned转载 2017-10-16 20:14:37 · 480 阅读 · 0 评论 -
C++中的static关键字的总结
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1#include转载 2017-10-16 20:26:25 · 117 阅读 · 0 评论 -
Linux操作系统下的多线程编程详细解析----条件变量
1.初始化条件变量pthread_cond_init#include int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的转载 2017-10-17 13:29:44 · 129 阅读 · 0 评论 -
设计模式在C语言中的应用--读nginx源码
市面上的“设计模式“书籍文章,皆针对Java/C++/C#等面向对象语言,似乎离开了面向对象的种种特性,设计模式就无法实现,没有用武之地了。是这样吗?设计模式的概念是从建筑领域引入的,本身从没歧视过面向过程编程语言,它只是对一类问题的普遍解决方案而已。面向对象语言因为有类、多态等特点,使得开发者们容易达到:隐藏细节、封装变化,而这与设计模式的目的比较一致,所以大师们爱把设计模式与面向对转载 2017-11-13 11:29:39 · 130 阅读 · 0 评论 -
c语言函数指针的理解与使用
1.函数指针的定义 顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子:?123A) char* (*fun1)(char * p1,char * p2);B) char* *fun2(char * p1,char * p2);C) char* fun3(char * p1,ch转载 2017-10-26 15:07:21 · 181 阅读 · 0 评论 -
gdb调试命令及程序崩溃时的内核转存core dump
1.gcc -g filename.c -o filename 需要生成带调试信息的文件2.调试 方式一:gdb filename 调试file可执行文件 方式二:>>gdb >>file filename$gdb -tui 启动gdb,并且分屏显示源代码3.打断点的方式 break line_num 在main.c中line转载 2017-11-03 10:09:19 · 1402 阅读 · 0 评论 -
用gdb调试程序笔记: 以段错误(Segmental fault)为例
用gdb调试程序笔记: 以段错误(Segmental fault)为例[转]1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5.gdb调试入门 一、背景介绍这个笔记主要介绍开源的程序调试器(gdb)的入门知识,目的是使unix/linux环境的编程新手能够快速学会使用gdb调试程序的方法转载 2017-11-03 10:16:20 · 567 阅读 · 0 评论 -
理解Native Crash处理流程
本文是基于Android 7.0源码,来分析Native Crash流程。转自 http://gityuan.com/2016/06/25/android-native-crash/一、Native Crash从系统全局来说,Crash分为Framework/App Crash, Native Crash,以及Kernel Crash。对于framework层或者app层的Cr转载 2017-11-17 14:02:33 · 6768 阅读 · 0 评论