⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testcache.c

📁 一种用于编译时头文件的缓存处理缓存源代码,使用起来就像C/C++编译器的缓存预处理器,简化该功能相应的环境改变时对内核的影响。
💻 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 + -