随笔分类 -  C代码

C语言结构体变量私有化
摘要:操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 将结构体的定义放入源码件中实现,头文件只放声明。 比如有如下结构体(obj.h文件中定义): 并定义 阅读全文
posted @ 2018-06-28 23:00 Mike_Zhang 编辑
浮点数网络传输
摘要:操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 Python 版本 : 2.7.5 思路如下 : 1、将浮点数a通过内存拷贝,赋值给相同字节的整型数据b; 2、将b转换为网络字节序变量c并发送到服务端; 3、服务端接收c并将c转换为主机字节序变量d; 4、将整型数据d通 阅读全文
posted @ 2018-03-20 21:38 Mike_Zhang 编辑
使用C语言操作InfluxDB
摘要:环境: CentOS6.5_x64 InfluxDB版本:1.1.0 InfluxDB官网暂未提供C语言开发库,但github提供的有: https://github.com/influxdata/influxdb-c 但这个版本比较早了,到目前为止不支持0.9及其以后的版本。 这里有我自己开发的I 阅读全文
posted @ 2017-05-01 12:25 Mike_Zhang 编辑
生成freeswitch事件的几种方式
摘要:本文描述了生成freeswitch事件的几种方式,这里记录下,也方便我以后查阅。 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 在freeswitch代码中加入事件 产生内置事件(以SWITCH_EVENT_MODULE_LOAD为例): 产生自定义事件: 使用嵌 阅读全文
posted @ 2016-09-27 01:39 Mike_Zhang 编辑
redis参考文档
摘要:本文为之前整理的关于redis的文档,放到博客上一份,也方便我以后查阅。 redis简介 Redis是一个开源的、高性能的、基于键值对的缓存与存储系统, 通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。 同时 Redis 的诸多高层级功能使其可以胜任消息队列、任务队列等不同的角色。 官方网 阅读全文
posted @ 2016-09-10 00:39 Mike_Zhang 编辑
Libevent笔记
摘要:Libevent简介libevent是一个基于事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。官网:http://libevent.org/特点:事件驱动,高性能;轻量级,专注于网络,不如ACE那么臃肿庞大,只提供了简单的网络API的封装,线程池,内存池,递归锁等均需要自己实现;开放源码,代码相当精炼、易读;跨平台,支持Windows、Linux、BSD和Mac OS;支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型 阅读全文
posted @ 2012-10-21 22:40 Mike_Zhang 编辑
命令行参数解析
摘要:linux下写服务端程序免不了用到命令行参数,这里我总结下C语言、bash脚本、python和go语言中的使用方法,也方便我以后查阅。这里我主要用的是getopt这个函数,首先看看c语言中的定义。头文件:#include<unistd.h>函数定义:int getopt(int argc,char * const argv[ ],const char * optstring); extern char *optarg; extern int optind, opterr, optopt;说明: getopt函数是用来分析命令行参数的,参数argc和argv是由main()传递的参数 阅读全文
posted @ 2012-09-07 00:45 Mike_Zhang 编辑
Reactor模式及在DSS中的体现
摘要:Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(区别在于多路复用器是边沿触发还是水平触发),多路复用器返回并将相应I/O事件分发到对应的处理器中。 Reactor是一种事件驱动机制,和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函... 阅读全文
posted @ 2012-08-16 00:08 Mike_Zhang 编辑
用popen函数操作其它程序的输入和输出
摘要:一、函数介绍1.1 函数原型:#include <stdio.h>FILE *popen(const char *command,const char *open_mode);1.2 说明 popen函数允许一个程序将另一个程序作为新进程启动,并可以传递数据给它或者通过它接收数据。command字符串是要运行的程序名和相应参数(比如:ls或ls -l),openmode必须是 r 或w。如果是r,被调用程序的输出可以被调用它的程序使用;如果是w,调用程序就可以用fwrite向被调用程序发送数据作为它在标准输入流上的输入。二、测试程序准备这里准备两个很简单的程序供下面测试使用。2.1 阅读全文
posted @ 2012-06-29 23:05 Mike_Zhang 编辑
扩展Asterisk1.8.7的AMI接口
摘要:Asterisk的AMI接口已经很丰富了,如果需要扩展,可以参考本文。一、扩展Asterisk的AMI接口涉及文件:main/manager.c 1、函数注册添加 myOriginate接口在函数int __init_manager(int reload)中添加如下代码:ast_manager_register_xml("myOriginate", EVENT_FLAG_ORIGINATE,action_myOriginate); // Add by Mike2、功能实现:View Code //Add by Mikestatic int action_myOriginat 阅读全文
posted @ 2012-06-18 23:34 Mike_Zhang 编辑
启动新进程(fork和exec系列函数实现)
摘要:一、复制进程映像1、fork函数介绍 此系统调用主要复制当前进程,在进程表中创建一个新的表项,新表项中的许多属性与当前进程是相同的。新进程几乎与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。2、典型使用fork的代码片段:pid_t pid;pid = fork();switch(pid){case -1: // error occur perror("fork failed"); exit(1);case 0: // child break;default: // parent break;}3、示例示例... 阅读全文
posted @ 2012-06-18 22:57 Mike_Zhang 编辑
结构体初始化测试
摘要:最近在看Asterisk的源代码,收获不小,决定记录下来学习Asterisk过程中的点滴,分享给大家,也方便我以后查阅……今天让我感到意外的是Asterisk中对结构体初始化(或者说成是赋值)的使用。比如定义结构体如下:typedef struct ST { int a; int b; pFun fun;}ST;一般的初始化是这样的:ST t2; t2.a=4; t2.b=5; t2.fun=test2;而我在源码中看到的是这样的:ST t1 = {.a=1,.b=2,.fun=test1};感觉好强大。。。。。。这里是我仿照着写的完整代码: 1 #include <stdio.h> 阅读全文
posted @ 2012-06-08 00:22 Mike_Zhang 编辑
扩展Asterisk1.8.7的Dialplan Applications
摘要:我前面有一篇文章介绍了怎么扩展Asterisk 1.8.7的CLI接口(http://www.cnblogs.com/MikeZhang/archive/2012/06/05/asterisk187CLIAddOns.html ),这里说说添加Dialplan Applications的方法。具体如下:一、准备工作1、进入之前建立的addons_test目录,建立app_testApp20120607.c和app_testApp20120607.exports文件;2、仿照app_testApp.c文件进行app_testApp20120607.c的编码,仿照app_testApp2.expo 阅读全文
posted @ 2012-06-07 20:28 Mike_Zhang 编辑
扩展Asterisk1.8.7的CLI接口
摘要:我之前有一篇文章(http://www.cnblogs.com/MikeZhang/archive/2012/04/14/asteriskCLIAppTest20120414.html)介绍过如何扩展asterisk的cli接口,本篇是它的继续,总结下,也方便我以后查阅。 大部分情况下,配置asterisk的拨号方案,用CLI、AMI之类的就可以满足我们的需求。可有些情况下涉及到业务的东东,需要数据库的参与(比如用sqlserve存储asterisk的录音记录等等),拨号方案那种静态的做法完全不用考虑,而原始的CLI、AMI已经不能满足需求。这时就需要考虑从源码入手,扩展asterisk... 阅读全文
posted @ 2012-06-05 23:56 Mike_Zhang 编辑
Linux下用freetds执行SqlServer的sql语句和存储过程
摘要:Windows下访问Sqlserver很方便,特别是用ADO,即便是用C++写代码,也没怎么感觉麻烦,如果是用C#的话,写起来估计更是飞一般的感觉,可现在我要处理的问题是在Linux下访问SqlServer,执行sql语句和存储过程…… 好,不废话了,下面开工。一、包含头文件#include<sybfront.h>//freetds#include<sybdb.h>//freetds二、执行sql语句或存储过程1、查询类1.1 核心代码:bool queryCmd(DBPROCESS *dbprocess,const char* strSql){ dbcmd(dbpro 阅读全文
posted @ 2012-03-30 18:03 Mike_Zhang 编辑
输入输出重定向
摘要:想象一下,当我们写了个程序,开始是在命令行下运行的程序,后来用MFC之类的改写为窗体程序,原先用printf输出的trace都不可见了,但是我们又需要(输出到文件分析),怎么办?1、开始写的时候你定义一个MyTrace的宏;2、你可以把printf换成fprintf;3、使用输出重定向。第一种情况很方便,可程序已经写出来了,显然不大可能;第二种情况可以是可以,但劳动量比较大;第三种我觉得可以。还记得不,在windows终端输入 "dir > 1.txt",或在linux终端输入"ls > 1.txt",即可实现把当前目录的文件列表导出到&qu 阅读全文
posted @ 2012-01-19 13:38 Mike_Zhang 编辑
C函数适配器
摘要:普通变量可以通过指针进行访问,用起来很方便,现在我有个想法,就是玩函数也要玩的这么炫,我想给它写个适配器……这里我主要是用可变参数和函数指针来实现,有两个测试代码片段:test1()和test2()。其中test1用的是可变参数的函数指针,test2用的是宏实现的函数适配器。代码如下: 1 /* 2 File : adapter.c 3 Author : Mike 4 E-Mail : Mike_Zhang@live.com 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #include <stdlib.h&g 阅读全文
posted @ 2012-01-17 17:24 Mike_Zhang 编辑