Linux C
文章平均质量分 90
460833359
这个作者很懒,什么都没留下…
展开
-
linux c 宏定义 #define _GNU_SOURCE 含义
今天我必须要使用 basename 函数,使用man手册查询了一下这个函数 man 3 basename 发现一个奇怪的信息名称basename,dirname-分析路径名组件简介 #include <libgen.h> char *dirname(char *path); char *basename(char *path); 警告:有两个不同的函数basename()-请参阅下面的。函数dirname()和basename()将以空结尾转载 2021-12-13 20:20:52 · 631 阅读 · 0 评论 -
动态库装载及 dlsym的RTLD_NEXT参数详解
在看公司spp框架代码的时候发现了如下一段宏定义,其中的dlsym函数及其RTLD_NEXT参数的含义不是很明白,于是网上搜了下这里做个记录。#define mt_hook_syscall(name) \do { \ if (!g_mt_sys...转载 2021-12-06 11:40:55 · 527 阅读 · 0 评论 -
linux c 宏定义 #define _GNU_SOURCE 含义
今天我必须要使用 basename 函数,使用man手册查询了一下这个函数 man 3 basename 发现一个奇怪的信息名称basename,dirname-分析路径名组件简介 #include <libgen.h> char *dirname(char *path); char *basename(char *path); 警告:有两个不同的函数basename()-请参阅下面的。函数dirname()和basename()将以空结尾的路径名转载 2021-12-06 11:37:04 · 687 阅读 · 0 评论 -
error:a label can only be part of a statement and a declaration is not a statement解决办法
原因是由于我在case之后进行变量的声明而导致的错误对此问题的分析: 由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,对象的作用域是在俩个花括号之间 也就是整个switch语句,其他的case语句也能看到,这样的话就可能导致错误。我们可以通过在case后面的语句加上大括号处理,之所以加大括号就是为了明确我们声明的变量的作用域,就是仅仅在本case之中,其实为了更规范的写switc...转载 2021-09-25 16:39:07 · 399 阅读 · 0 评论 -
assert()函数用法总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badp转载 2016-07-17 23:39:23 · 263 阅读 · 0 评论 -
Linux多线程──生产者消费者
生产者消费者问题这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产转载 2016-07-17 23:59:48 · 560 阅读 · 1 评论 -
C语言中常用到的几个与系统时间相关的结构体及其说明
在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种。Unix/Linux系统下有以下几种时间结构:1、time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒;由函数time()获取;该类型定义在头文件 /usr/include/sys/time.h 中:#define _TIME_T type转载 2016-11-21 00:41:10 · 486 阅读 · 0 评论 -
点阵字库的显示原理
在嵌入式开发中,经常会用到字库。字库分为矢量字库和点阵字库,毋庸置疑,矢量字库的显示效果是最好的,但是点阵字库是免费的。所以在很多场合,点阵字库仍然是产品开发的首选。 点阵从本质上讲就是单色位图,它使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点。矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列。位图就是这种二维的阵列,这...转载 2018-06-05 16:34:43 · 1350 阅读 · 1 评论 -
Linux内核链表及list_entry解析
链表是一些包含数据的独立数据结构的集合,链表中的每一个节点通过链或者指针连接在一起。程序通过指针访问链表中的节点。链表一般分为单链表和双链表。 1.单链表 单链表中,每个节点包含指向下一个节点的指针。链表最有一个节点的指针字段值为NULL,表明链表后面不再有其它节点。下面是一张单链表的图: 对应的数据结构为: C代码 typedef struct NODE...转载 2018-12-20 21:36:31 · 945 阅读 · 0 评论 -
linux 两种超时等待的实现
1. 基于信号量1 信号量初始化 /*信号量声明*/ sem_t sem; /*信号量初始化*/ if(sem_init(&sem, 0, 0)) printf("semaphore sem intitialization failed\n");123456 2 超时等待:线程1 /*超时时间宏: s*/...转载 2018-12-18 22:59:44 · 4927 阅读 · 0 评论 -
Linux下利用backtrace追踪函数调用堆栈以及定位段错误
一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。int backtrace(void **buffer,int size)该函数用于获取当前...转载 2019-04-25 20:57:16 · 343 阅读 · 0 评论 -
linux中ulimit作用
一、作用Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数。ulimit主要是用来限制进程对资源的使用情况的,它支持各种类型的限制,常用的有:内核文件的大小限制进程数据块的大小限制Shell进程创建文件大小限制可加锁内存大小限制常驻内存集的大小限制打开文件句柄数限制分配堆栈的最大大小限制C...转载 2019-04-25 20:58:44 · 1381 阅读 · 0 评论 -
Makefile嵌套编译多文件项目
在多文件的项目中,一个工程中的源文件比较多,其按类型、功能、模块分别放在若干个目录中,为了项目更加规整,我们常常要将源文件头文件执行文件等分开,所以在编译Makefile时就要做好整个项目的编译准备工作,Makefile定义了一系列的规则来指定,哪些文件需要编译,需要生成什么目标,需要生成库等等。下面就用实例来列出这些规则,这也是一个基本框架,后边如果需要添加更多的源文件和目录就可以如法炮制,这...转载 2019-05-22 15:16:41 · 894 阅读 · 0 评论 -
linux___assert()___函数操作
这个assert函数一直在心里有个结,没有好好的理清楚,今天有时间,看明白一些,做下笔记,如下。(注,例子是从网上找的,自己加以修改后测试)/*说明:assert 其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。如果加了-DNDEBUG 等于去掉了assert函数。*/#include #include #include转载 2016-07-17 23:30:58 · 2136 阅读 · 0 评论 -
typeof在linux中妙用
今天偶然又看到了typeof这个东西,只知道它大概是返回变量的类型,后来上网查了下发现这个关键字在linux中用的非常多, 这里大概叙述了 typeof是一个什么东西,怎么用,实际上可以用简单的话来重述。如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp.)返回的 是exp.的数据类型大小,那么typeof(exp.)返回的就是exp.的数据类型。值得注意的是在上面的话里我们可转载 2016-07-17 23:18:20 · 4279 阅读 · 0 评论 -
Linux环境下提升普通用户权限(sudo)
Linux环境下提升普通用户权限(sudo)一. Linux环境下提升普通用户权限(sudo) 用sudo让普通用户获得超级用户的一部分权利,能够做超级用户才能做的事情,还能够对普通用户身份做一些限制,指定某一个或某几个人来做,并且普通用户不需要知道超级用户的密码,就能够完成超级用户才能完成的任务。环境:管理员root和普通用户redhat1. 授权之前测试:# /转载 2016-01-18 15:40:00 · 2475 阅读 · 0 评论 -
writeb(), writew(), writel(),readb(), readw(), readl() 宏函数
writeb(), writew(), writel() 宏函数功能 :往内存映射的 I/O 空间上写数据。writeb() I/O 上写入 8 位数据 (1字节) writew() I/O 上写入 16 位数据 (2字节) wirtel() I/O 上写入 32 位数据 (4字节) 原型 :引用 #include void w转载 2016-01-19 10:59:50 · 495 阅读 · 0 评论 -
printk()函数的总结
我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出,更加容易地掌握系统当前的状况。对程序的调试起到了很重要的作用。(下文中的日志级别和控制台日志控制级别是一个意思)printk(日志级别 "消息文本");这里的日志级别通俗的说指的是对文本信息的一种输出范围上的指定。日志级别一共有8个级别,printk的日志级别定义如下(在linux26/转载 2016-01-21 16:11:50 · 379 阅读 · 0 评论 -
Linux中的文件描述符与打开文件之间的关系
1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件转载 2016-01-09 17:00:28 · 409 阅读 · 0 评论 -
Linux中open函数详解
初级文件I/O函数(即不用缓存的I/O函数):open(打开文件) 相关函数 read,write,fcntl,create,lseek,close,link,stat,umask,unlink,fopen 头文件 #include #include #include 定义函数 int open( const char * pathnam转载 2016-01-09 17:07:55 · 795 阅读 · 0 评论 -
Linux man命令的使用方法
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。Linux的man手册共有以下几个章节:代號代表內容1使用者在shell中可以操作的指令或可执行档2系統核心可呼叫的函数与工具等3一些常用的函数(function)与函数库(library),大部分是C的函数库转载 2016-01-09 17:11:00 · 481 阅读 · 0 评论 -
Linux C编程--main函数参数解析
我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组转载 2015-12-25 15:00:17 · 935 阅读 · 0 评论 -
hostent h_addr_list
struct hostent { char FAR * h_name; /* official name of host */ char FAR * FAR * h_aliases; /* alias list */ short h_addrtype; /* host addres转载 2016-01-11 10:44:00 · 1650 阅读 · 0 评论 -
linux 用户添加root权限
1、添加普通用户[root@server ~]# useradd chenjiafa //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa //修改密码Changing password for user chenjiafa.New UNIX password: //在这里输入新转载 2016-01-15 13:53:42 · 505 阅读 · 0 评论 -
Makefile中用宏定义进行条件编译
在源代码里面如果这样是定义的: #ifdef MACRONAME //可选代码 #endif 那在makefile里面 gcc -D MACRONAME=MACRODEF 或者 gcc -D MACRONAME 这样就定义了预处理宏,编译的时候可选代码就会被编译进去了。 对于GCC编译器,有如下选项: -D macro=s转载 2016-05-06 23:00:52 · 5286 阅读 · 0 评论 -
strtoul函数的使用
其函数原型如下:unsigned long strtoul(const char *nptr,char **endptr,int base )参数1:字符串起始地址参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa",就会把字符串当做16进制处理,输出的为10。更多的下面详转载 2016-06-27 00:11:30 · 1435 阅读 · 0 评论 -
浅谈C语言中的强符号、弱符号、强引用和弱引用
这篇文章主要介绍了C语言中的强符号、弱符号、强引用和弱引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下首先我表示很悲剧,在看《程序员的自我修养--链接、装载与库》之前我竟不知道C有强符号、弱符号、强引用和弱引用。在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点。 首先我们看一下书中关于它们的定义。 引转载 2016-06-19 21:55:40 · 1101 阅读 · 0 评论 -
Linux几个调试宏_FUNCTION_ _TIME_ _LINE_ _FILE_ _DATA_
Linux几个调试宏__FUNCTION__ __TIME__ __LINE__ __FILE__ __DATA__这几个宏是编译器内置的,不是在哪个头文件中包含的直接上最简单的例子就好了,没必要多说。源码:#include int main(){ printf("The file is %s.\n",__FILE__); printf( "转载 2016-07-17 23:11:54 · 1507 阅读 · 0 评论 -
一个最简单的makefile示例
1.hello.c#include int main(){ printf("Hello World!\n"); return 0;}2.Makefilehello : hello.o cc -o hello hello.ohello.o : hello.c cc -c hello.cclean : rm hel转载 2016-01-17 16:27:58 · 506 阅读 · 0 评论