📄 testcache.c
字号:
/********************************************************************
created: 2008/01/25
filename: testcache.c
author: Lichuang
purpose:
*********************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <signal.h>
#include <arpa/inet.h>
#include "ccache.h"
ccache_t* cache;
int createchild();
void mainloop();
void createrandstring(char* string, int len);
int main()
{
cache = create_cache(100, sizeof(int), 10, 100, "./testmap", 1);
if (NULL == cache)
{
printf("create_cache error!\n");
return -1;
}
#if 1
createchild(2);
#else
mainloop();
#endif
return 0;
}
int createchild(int childnum)
{
int fd, ischild;
if (0 < childnum)
{
ischild = 0;
while (!ischild)
{
if (0 < childnum)
{
switch((fd = fork()))
{
case -1: // fork error
{
return -1;
}
break;
case 0: // child
{
// 子进程退出循环
printf("[%s] [%s] [%d]: 创建子进程 %d 成功!\n"
, __FILE__
, __FUNCTION__
, __LINE__
, getpid());
ischild = !0;
mainloop();
}
break;
default: // parent
{
childnum--;
}
break;
}
}
else
{
int status;
if (-1 != (fd = wait(&status)))
{
//++childnum;
}
else
{
break;
}
}
}
if (ischild)
return 0;
}
else
{
return -1;
}
return 0;
}
int cmp_fun(const void* data1, const void* data2)
{
return memcmp(data1, data2, sizeof(char) * 20);
}
void del_fun(const void* key, const void* data)
{
int *num = (int*)data;
char k[101] = {'\0'};
strncpy(k, key, 100);
printf("delnode <%s, %d>\n", k, *num);
}
void update_fun(const void* org, void* data)
{
int *num = (int*)data;
*num = *num + *(int*)org;
}
void visit_fun(const void* key, void* data)
{
int *num = (int*)data;
char k[101] = {'\0'};
strncpy(k, key, 100);
printf("visit node <%s, %d>\n", k, *num);
}
void mainloop()
{
char string[21];
int num, i, ret;
srand((unsigned)time(NULL));
for (i = 0; i < 100; ++i)
{
printf("pid = %d, i = %d\n", getpid(), i);
createrandstring(string, 20);
num = rand();
if (0 > (ret = insert_data(string, &num, cache, cmp_fun, del_fun)))
{
printf("[pid = %d] insert <%s, %d> error!\n", getpid(), string, num);
//break;
}
else
{
printf("[pid = %d] insert <%s, %d> success!\n", getpid(), string, num);
num = 1;
if (0 <= update_or_insert_data(string, &num, cache, cmp_fun, del_fun, update_fun))
{
printf("[pid = %d] update_or_insert <%s, %d> success!\n", getpid(), string, num);
}
/* 把以下代码注释掉是为了测试delfun, 因为在节点不够用时需要进行节点的淘汰, 否则可以测试update, del操作
int num1, ret1;
num = rand() + 123;
if (ret != (ret1 = update_data(string, &num, cache, fun1)))
{
printf("[pid = %d] update <%s, %d> error!\n", getpid(), string, num);
}
else
{
printf("[pid = %d] update <%s, %d> success!\n", getpid(), string, num);
}
if (ret != (ret1 = delete_data(string, &num1, cache, fun1)) || num != num1)
{
printf("[pid = %d] delete <%s, %d> error!\n", getpid(), string, num);
}
else
{
printf("[pid = %d] delete <%s, %d> success!\n", getpid(), string, num);
}
*/
}
}
printf("begin visit cache\n");
visit_cache(cache, visit_fun);
printf("end visit cache\n");
printf("pid = %d, test done\n", getpid());
}
const char CCH[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
void createrandstring(char* string, int len)
{
int x, i;
for (i = 0; i < len; ++i)
{
x = rand() % (sizeof(CCH) - 1);
string[i] = CCH[x];
}
string[i] = '\0';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -