HAProxy Tips

1

size=(size+align+1)&-align //size 是align的整数倍

因为size&-align等于比n*align . n*align< size.
假设align的最低位1为第x位,那么x-1,x-2,1位都为0,&操作会让这些位置0,从而保证size&-align 可以是n*align。

2
可以定义一个fd_set类型的数组。这样的好处是可以直接操作大于sizeof(fd_set)个比特

#include<unistd.h>
#include<sys/select.h>
fd_set A[ARR_NUM];
FD_SET (i,A)//i (0~ARR_NUM*sizeof(fd_set)-1) 设置第i个bit为1
FD_CLR (i,A)// 设置第i个bit为0
FD_ISSET (i,A)// 判断第i个为0 返回0 否则1

3 vsnprintf 可以格式化字符串

int chunk_printf(struct chunk *chk, const char *fmt, ...)
{
    va_list argp;
    int ret;

    if (!chk->str || !chk->size)
        return 0;

    va_start(argp, fmt);
    ret = vsnprintf(chk->str, chk->size, fmt, argp);
    va_end(argp);
    chk->len = ret;

    if (ret >= chk->size)
        ret = -1;

    chk->len = ret;
    return chk->len;
}

4
attribute((constructor)) 在main函数之前执行,
attribute((destructor)) 在main退出之后执行

void breforemain() __attribute__((constructor));
void aftermain() __attribute__((destructor));

5 读取当前执行文件路径

    len = readlink("/proc/self/exe", buffer, buffer_size - 1);

6 执行bin

execv(argv[0], argv); // argv[0]是执行的二进制文件,argv是执行的参数

7 读取目录下所有文件

int scandir(const char *dir, struct dirent ***namelist,
             int(*filter)(const struct dirent *),
             int(*compar)(const struct dirent **, const struct dirent **));

在HAproxy里面的示例代码如下

struct dirent **dir_entries = NULL;
dir_entries_nb = scandir(wl->s, &dir_entries, NULL, alphasort);
for (dir_entries_it = 0; dir_entries_it < dir_entries_nb; dir_entries_it++) {
    struct dirent *dir_entry = dir_entries[dir_entries_it]; //遍历访问dir_entries路径//wl->s 为需要访问的路径
//dir_entries为dirent *类型的数组
//filter 为NULL
//alphasort为系统默认 
发布了46 篇原创文章 · 获赞 1 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章