C语言常用宏总结

获取数组长度

/// Obtain the number of elements in the given C array

#define GET_ARRAY_LEN( arrayName ) (sizeof( arrayName ) / sizeof(( arrayName)[ 0 ] ))

使用例子:

#include <stdio.h>

/// Obtain the number of elements in the given C array

#define GET_ARRAY_LEN( arrayName ) (sizeof( arrayName ) / ......

无锁队列

在分布式系统中经常会使用到共享内存,然后多个进程并行读写同一块共享内存,这样就会造成并发冲突的问题, 一般的常规做法是加锁,但是锁对性能的影响非常大,所以就搞出来了一个无锁队列。

无锁队列的关键原理是CPU提供了一个指令CAS,这条指令是一个原子指令,执行过程中不允许被打断。

它接受三个参数:需要修改值的地址、旧值、新值;CAS指令执行时先读取该地址的当前值,将当前值于旧值进行比较, 如果相等则说明此值没有被修改过将当前值更新为新值,操作成功;

如果不相等则说明此值被其他进程修改过,直接返回失败,此时需要程序重新读取最新的值,再次调用CAS指令进行更新,重复此步骤直到成功......

chroot用法

chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。

在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:

增加了系统的安全性,限制了用户的权力:

在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。......

Linux C 信号使用

结合几个短小精悍的例子,学习Linux C信号的基本使用,给出程序运行方法和结果。

#include<stdio.h>

#include<signal.h>

#include<unistd.h>

void sig_handler(int signo)

{

if (signo == SIGINT)

printf("received SIGINT\n");

}

int main(void)

{

if (signal(SIGINT, sig_handler) == SIG_ERR)

printf("\ncan't catch SIGINT\n");

//......

void *的作用

在stackoverflow上看到一篇关于void *作用觉得非常不错,将作者的回答贴在下面,后续补充自己的理解。

A pointer to void is a "generic" pointer type. A void * can be converted to any other pointer type without an explicit cast. You cannot dereference a void * or do pointer arithmetic with it; you must convert it to a pointer to a......

TLPI-Chapter 48 System V 共享内存

共享内存允许两个或多个进程共享物理内存的同一块区域(通常称为段)。由于一个共享内存段会称为一个进程用户空间内存的一部分,因此这种IPC机制无需内核介入。所有需要做的就是让一个进程将数据复制进共享内存中,并且这部分数据会对其他所有共享同一个段的进程可用。

与管道或消息队列要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比,这种IPC技术的速度更快。

共享内存允许两个或多个进程共享内存的同一个分页。通过共享内存交换数据无需内核干涉。一旦一个进程将数据复制进一个共享内存段中之后,数据将会立刻对其它进程可以见。共享内存是一种快速的IP......

df与du命令的区别

apue课后题4.7在运行图 4-16 的程序时,使用了 df(1) 命令来检查空闲的磁盘空间,为什么不使用 du(1) 命令?

这里首先介绍下du和df的区别,再回答上面的问题。

1) du == Disk Usage

How much disk space is being used by these files?

2) df == Disk Free

How much free disk space do we have?

参考stackoverflow

这里有个非常经典的答案:

You most probably know that you can remove......

Linux下LD_PRELOAD的简单用法

在阅读某大佬写的一篇blog,里面有提到LD_PRELOAD技术作为调试和测试手段,学习该知识点,主要参考文章:

Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs

LD_PRELOAD用法

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD > LD_LIBRARY_PATH > /etc/ld.so.cache > /lib>/usr/lib。程序中......

使用jansson解析JSON

介绍

Jansson是一个对json格式进行编码,解码,操作的c语言库,有以下特点

简单的api设计

文档详尽

无其他依赖库

完全支持UTF-8

大量的测试用例

Jansson是MIT license源码发布方式

Jansson支持多个平台,包括Unix以及windows

编译安装

解压并编译

tar -xvf jansson-2.4.tar.gz

./configure

make

make check

make install

简单使用

只需要包含一个头文件

#include <jansson.h>

直接连接库方式编......

cJSON1.7.11源码学习

由于项目中使用到json,之前使用只是参考别人的使用,未对cJSON源码进行学习,因此本文学习cJSON源码内部实现,记录学习cJSON源码的过程。

JSON相关知识:json介绍

学习的cJSON源码版本为1.7.11.

添加中文注释版本github地址为:cJSON1.7.11中文注释版

准备工作#ifdef __WINDOWS__

/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a pro......