![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux编程
文章平均质量分 57
fengxin215
这个作者很懒,什么都没留下…
展开
-
printf打印输出彩色信息辅助调试
向来写的调试信息都是随意输出,无论是查看起来还是写起代码来都不方便,于是写了一个debug信息输出库,便于输出debug信息。debug 信息分为close,info,warning,error,critical五级,分别以不同的颜色输出,使用DEBUG1,DEBUG2,DEBUG3,DEBUG4宏来调用,全局变量g_debug定义为0时,关闭debug信息输出,高等级会使低于这个等级的d原创 2014-03-25 16:11:03 · 274 阅读 · 0 评论 -
获取容量
long long GetDisktotalSpace(char *pDisk){ long longtotalspace = 0; structstatfs disk_statfs; if(statfs(pDisk, &disk_statfs) >= 0) { totalspace = (((long long)dis原创 2014-03-25 16:11:58 · 193 阅读 · 0 评论 -
__attribute__((packed))详解
1. __attribute__ ((packed))的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。例如:在TC下:struct my{ char ch; int a;}sizeof(int)=原创 2014-03-25 16:16:35 · 211 阅读 · 0 评论 -
#、##操作符,__VA_ARGS__
1.#——字符串假如希望在字符串中包含宏参数,ANSIC允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).#incldue#define PSQR(x) printf("the square of" #x "is %d.\n",(x)原创 2014-03-25 16:16:33 · 160 阅读 · 0 评论 -
sizeof union struct 内存对齐
sizeof union struct 内存对齐(2010-07-30 23:24:33)转载标签:itunion u{ double a; int b;};union u2{ char a[13]; int b;};union u3{ char a[13]; char b;};cout<<sizeof(u)<<endl;// 8cout<<s原创 2014-03-25 16:14:07 · 197 阅读 · 0 评论 -
关于双向链表的一些分析
一、插入操作(insert)(一)基本原理 双链表就好像是手拉手站成一排的人,每个人的右手(next)拉着下一个人,左手(prior)拉着前一个人,每两个人之间有两支手互联.插入操作实际是向队伍中增加人员,他需要拉上左右两边的人,即共三个人要发生关系,由于每两个人之间有两支手互联,所以要发生4次操作.如已知节点q,p,需插入s,(称为原型吧).-------------------原创 2014-03-25 16:14:05 · 218 阅读 · 0 评论 -
目录是否存在,目录下文件是否存在
int DH_LocalIsExist(char *localdir){ int retval = STATUS_AUX_OK; DIR *handle= NULL; handle =opendir(localdir); if (handle== NULL) { return STATUS_AUX原创 2014-03-25 16:12:13 · 1866 阅读 · 0 评论 -
Linux 如何解决共享库的版本控制
Linux 系统,也同样面临和Window一样的问题,如何控制动态库的多个版本问题。Window之前没有处理好,为此专门有个名词来形容这个问题“Dll hell”,其严重影响软件的升级和维护。 Dllhell 是指windows上动态库新版本覆盖旧版本,但是却不兼容老版本。常常发生在程序升级之后,动态库更新,原有程序运行不起来;或者装新软件,但是已有的软件运行不起来。同样Linux操作原创 2014-03-25 16:16:57 · 377 阅读 · 0 评论 -
获取文件长度
fp =fopen(filename,"rb"); fseek(fp,0,SEEK_END); //定位到文件末尾 file_length= ftell( fp ); //获取文件当前位置 rewind(fp); //将文件指针重新指向文件开头原创 2014-03-25 16:16:31 · 154 阅读 · 0 评论 -
堆和栈的区别 (转贴)
堆和栈的区别 (转贴)非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥!堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。原创 2014-03-25 16:14:10 · 137 阅读 · 0 评论 -
链表逆序
List *list_reverse(List *head) { List *p,*q,*r; p=head; q=p->next; while(q!=NULL) { r=q->next; q->next=p;(1) p=q; q=r; } head->next=NULL; head=p; return head; } 如上,是带原创 2014-03-25 16:14:16 · 162 阅读 · 0 评论 -
停止运行可执行文件
int aux_stop_exe(char *exe_name,kill_type killtype){ int retval =STATUS_AUX_OK; int id =0; retval =aux_get_pid_from_program(exe_name, &id); if(retval !=STATUS_AUX_OK)原创 2014-03-25 16:12:09 · 290 阅读 · 0 评论 -
技巧: 使用truss、strace或ltrace…
https://www.ibm.com/developerworks/cn/linux/l-tsl/转载 2014-03-25 16:18:36 · 244 阅读 · 0 评论 -
编译时预定义
#includevoid main(){#ifdef DEFINE_TEST printf("defined\n");#else printf("nodefined\n");#endif}gcc -o define define.c -DDEFINE_TEST //预定义了DEFINE_TEST原创 2014-03-25 16:17:01 · 234 阅读 · 0 评论 -
彻底搞定C指针-函数名与函数指针
函数名与函数指针一 通常的函数调用 一个通常的函数调用的例子://自行包含头文件void MyFun(intx); //此处的申明也可写成:voidMyFun( int );int main(int argc, char* argv[]){ MyFun(10); //这里是调用MyFun(10);函数 return0;}voi原创 2014-03-25 16:16:02 · 115 阅读 · 0 评论 -
判断文件是否存在
用函数access,头文件是io.h,原型: int access(const char *filename, int amode);amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。这个函数还可以检查其它文件属性:06 检查读写权限04 检查读权限02 检查写权限01 检查执行权限00原创 2014-03-25 16:15:47 · 838 阅读 · 0 评论 -
一个用标准C写的ini文件操作程序
ini文件的基本格式如下: 1: [Section1] 2: Name1=Value1 3: Name2=Value2 4: 5: [Section2] 6: Name1=Value1 7: Name2=Value2ini文件由section组成,每个section内可以定义若干个属性,以及他们的值。原创 2014-03-25 16:13:48 · 338 阅读 · 0 评论 -
保存数据到文件中
#define SINGLE_WRITE_LEN 1024 int dh_save_file(unsigned char *data_buf, intdata_len, const char*file_name) { int retval= STATUS_PARSE_OK; intremain_len = data_len; int原创 2014-03-25 16:13:46 · 301 阅读 · 0 评论 -
编译驱动模块错误——build: 没有那…
解决编译驱动模块时的错误:make -C /lib/modules/2.6.25.6-27.fc8/buildSUBDIRS=/home/fx/project/ov511-2.32 modulesmake: *** /lib/modules/2.6.25.6-27.fc8/build: 没有那个文件或目录。 停止。make: *** [default] 错误 2此错误的原因是build原创 2014-03-25 16:13:00 · 983 阅读 · 0 评论 -
C调用C++函数库
C调用C++函数库,一般不能直接调用,需要将C++库转换成C接口输出,方可以使用C调用,看下面的例子: *aa.cxx#include "add.h"int sample::method(){ cout} * aa.h#include using namespace std;class sample{ public: intme原创 2014-03-25 16:12:30 · 240 阅读 · 0 评论 -
面向Linux程序员和系统管理员的技…
http://www.ibm.com/developerworks/cn/linux/原创 2014-03-25 16:14:29 · 150 阅读 · 0 评论 -
动态链接和动态链接库
动态链接(Dynamic Linking)是相对于静态链接(StaticLinking)而言的。程序设计中,为了能做到代码和模块的重用,程序设计者常常将常用的功能函数做成库,当程序需要实现某种功能时,就直接调用库文件中的函数,从而实现了代码的重用。早期的程序设计中,可重用的函数模块以编译好的二进制代码形式放于静态库文件中,在MS的操作系统中是Lib为后缀的文件。程序编写时,如果用户程序调用到原创 2014-03-25 16:13:59 · 211 阅读 · 0 评论 -
获取已用空间
long long GetDiskusedSpace(char *pDisk){ long longusedspace = 0; structstatfs disk_statfs; if(statfs(pDisk, &disk_statfs) >= 0) { usedspace = (((long long)disk_s原创 2014-03-25 16:12:00 · 147 阅读 · 0 评论 -
从一个非典型的内存越界访问问题看…
这篇文章想以一个内存越界问题分析过程来说明进程的内存布局。问题有点巧合,程序刚好没有出现segmentfault,而是继续在运行,却出现了很诡异的结果。实例说明:编写一个对Linux消息队列的测试程序,同时提供收发程序,接收程序使用NOWAIT的方式来接收,发送端每隔一段时间发送一个消息。接收端和发送端都作一个操作次数统计,接收端的读取间隔时间设置较短,因此存在消息队列为空的情况,在此情况原创 2014-03-25 16:18:30 · 312 阅读 · 0 评论 -
终端输入字符后不用按回车,就可以…
write(0, buffer, size);可以直接把buffer中的数据送到终端显示。read(0, buffer, size);可以直接把终端输入的数据读到buffer中。在终端输入字符后不用按回车,就可以接收终端输入的字符。#include #include int set_raw_mode(void){ int fd =STDIN_FILENO; str原创 2014-03-25 16:13:35 · 924 阅读 · 0 评论 -
在Linux中创建静态库和动态库
在Linux中创建静态库和动态库我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。在创建函数库前,我们先来准备举例原创 2014-03-25 16:12:52 · 128 阅读 · 0 评论 -
获取进程ID
int aux_get_pid_from_program(char* process_name, int*ret_pid){ if(ret_pid) { *ret_pid =-1; } DIR *pdir =NULL; structdirent *pde = NULL; FILE *pf =NULL; ch原创 2014-03-25 16:12:04 · 133 阅读 · 0 评论 -
c语言实现面向对象编程
介简: Redy的开发语言是C,但在源码中,有很多地方都使用到了面向对象编程的方法,例如:在基本数据类型这一个模块,所有的数据类型都继承robject;在抽象语法树模块,所有的节点都继承astobjct。在linux内核中,也有很多是使用的面向对象方法,在虚拟文件系统,驱动模型中都可以看到。c语言是一种结构化编程语言,以模块工能和处理过程设计为主,实现数据与代码分隔化。面向对象原创 2014-03-25 16:17:16 · 227 阅读 · 0 评论 -
Linux消息队列
Linux操作系统system V进程间通信,主要有三种:1、消息队列;2、信号量;3、内存共享。 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。Linux消息队列管理:1、创建消息队列 在使用一个消息队列前,需要使用msgget函数创建该消息队列,其函数声明: extern intmagget(key_t _key,int _msgflg)原创 2014-03-25 16:14:25 · 126 阅读 · 0 评论 -
获取文件系统类型
long GetDiskfileSystem(char *pDisk){ longfilesystem = 0; structstatfs disk_statfs; if(statfs(pDisk, &disk_statfs) >= 0) { filesystem =disk_statfs.f_type; }原创 2014-03-25 16:12:02 · 137 阅读 · 0 评论 -
char *p = "Hello" 所指内存是常量
char *p = "Hello" 所指内存是常量char* p = "Hello"; 这里 “Hello” 是存在静态存储区内的字符串常量,把这个存储区首地址赋给了 p ,所以不能修改 p 所指的字符数组.char p[] = "Hello"; 语句是数组P[]做了字符串“Hello“的拷贝,所以他可以对拷贝字符串做任意修改.原创 2014-03-25 16:14:12 · 312 阅读 · 0 评论 -
堆和栈的区别
堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(原创 2014-03-25 16:16:14 · 138 阅读 · 0 评论 -
一个通用的双向链表管理程序
一个通用的双向链表管理程序在写一个小工具的时候,需要用到对ini文件的管理。为了让这个小工具在Linux也适用,所以在写程序的时候没有使用mfc提供的类库,也没有使用windows提供的ini操作函数,直接拿标准C写了一个。在操作ini的过程中,我拿两种双向链表来描述一个ini文件,也就意味着,要针对每种链表都写一套插入、删除之类的操作函数,格外麻烦。索性,就写了一个通用的双向链表管理程序原创 2014-03-25 16:13:50 · 195 阅读 · 0 评论 -
确认进程状态正常
int aux_check_defunct_by_pid(int pid){ char tmp[512]={0}; char result[512]={0}; char Cpid[128]={0}; FILE *fd; int num=0; int retval =STATUS_AUX_OK; int n =0;原创 2014-03-25 16:12:11 · 176 阅读 · 0 评论 -
启动可执行文件
int aux_start_exe(char *exe_full_path, char *argv, char*exe_name){ int retval =STATUS_AUX_OK; int pid =0; DBGOUT("Start exe, exe_full_path = %s.\n",exe_full_path); if(fork() =原创 2014-03-25 16:12:07 · 194 阅读 · 0 评论 -
C语言运算符优先级
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员名->成员选择(指针)对象指针->成员名2-负号运算符-表达式右到左单目运原创 2014-03-25 16:11:26 · 134 阅读 · 0 评论 -
linux消息队列操作
对消息队列的操作无非有下面三种类型:1、 打开或创建消息队列消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可;注:消息队列描述字是由在系统范围内唯一的键值生成的,而键值可以看作对应系统内的一条路经。2、 读写操作消息读写操作非常简单,对开发人员来说,每个消息都类似如下的数据结构:struct ms原创 2014-03-25 16:11:07 · 131 阅读 · 0 评论 -
const与#define
虽然他们在使用中感觉“差不多”,但是他们在实现上有什么区别?请看下面的代码:#define T 13int main(){ const int t=13; int n=t; int m=T;}1.差别:const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Ti原创 2014-03-25 16:14:03 · 109 阅读 · 0 评论 -
产生随即数
产生随即数(1—30):#include #include void main(void){ int a; srand((int)time(0)); for(;;) { sleep(1); //a = random(30); a =原创 2014-03-25 16:12:45 · 160 阅读 · 0 评论 -
C逐行读取文本文件
#include ; #include ; int main(void) { FILE *fp; char * line= NULL; size_t len =0; ssize_tread; fp =fopen("/etc/m原创 2014-03-25 16:16:20 · 185 阅读 · 0 评论