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为系统默认