libubox中uloop库的使用

摘要:
rsync.pid){/*Thisischildprocess*/execvp;fprintf;exit(-1);}如果{fpprintf;return-1;}uloop_process_add;}Intmain(){…..uloop_init();//初始化fun();uloop_run();}以上是使用库之前的一个简单伪代码演示。ULoop仅适用于单个线程中的任务。多线程会导致错误。

摘自:https://blog.csdn.net/liangdsing/article/details/53201410

uloop.c是libubox的一个小模块,简化了编程

1. socket 使用
#include ""

struct uloop_fd ufd; //创建uloop_fd全局变量

static void fd_handler(struct uloop_fd *u, unsigned int ev)
{
    if(recvfrom(u->fd, ...)) == -1) {

    } else {
        //do your work
    }
}



int main()
{
    //
    int socket = socket(....);

    ufd.fd = socket;
    uloop_init(); //使用库初始化

    ufd.cb = fd_handler;
    uloop_fd_add(&ufd, ULOOP_READ));

    uloop_run();
}
2. 定时器使用
#include ""

struct uloop_timeout timeout;    //创建uloop_timeout全局变量

int frequency = 5; //每隔5秒超时一次

static void timeout_cb(struct uloop_timeout *t)
{
    //do your work

    uloop_timeout_set(t, frequency * 1000);//设置下次的超时时间
}



int main()
{
    uloop_init();    //使用库初始化

    timeout.cb = timeout_cb;

    uloop_timeout_set(t, frequency * 1000);//设置下次的超时时间

    uloop_run();

}
3. 子进程的使用

其作用是在子进程中调用rsync命令进行文件同步,子进程退出后调用rsync_complete回调函数

#include ""

static struct uloop_process rsync;    //创建rsync全局变量

static void rsync_complete(struct uloop_process *proc, int ret)
{
    //do something where child exit;
    printf("rsync work is complete
");
}


function fun()
{

    char *argv[]={"rsync", "-az", "rsync://XYZ@192.168.26.99/www","/root/www/","--password-file=/root/rsync.secrets", NULL};
    rsync.cb = rsync_complete;
    rsync.pid = fork();



    if (!rsync.pid) {
        /* This is child process*/
        execvp(argv[0], argv);
        fprintf(stderr, "fork failed
");
        exit(-1);

    }

    if (rsync.pid <=0) {
        fprintf(stderr, "fork failed2
");
        return -1;
    }

    uloop_process_add(&rsync);

}

int main()
{
    .....
    uloop_init();    //使用库前进行初始化
    fun();
    uloop_run();
}
 

以上是简单的伪代码演示。uloop只适合于单线程中的任务,多线程会有bug。

免责声明:文章转载自《libubox中uloop库的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇自定义android控件EditText 自定义边框 背景禁止浏览器自动填写下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

(转)在CentOS中修改中文字符集

本文介绍在linux的shell环境下优化linux中文显示的方法。在CentOS7以前的版本下,默认的字符集的路径一般保存在/etc/sysconfig/i18n文件中。但是在CentOS7版本中,字符集配置文件位于/etc/locale.conf。通过source命令即可使修改生效:[ruby]viewplaincopy#source/etc/local...

TCL基本语法2

TCL基本语法21、format和scan两个基本的函数,和C语言中的sprintf和scanf的作用基本相同。format将不同类型的数据压缩在字符串中,scan将字符串中的数据提取出来。setnameJacksetage100setworker[format"%sis%dyearsold"$name$age]puts$workerscan$worker"...

RedisTemplate

在SpringBoot@RequestMapping(“/del/{key}”)publicStringdel(@PathVariable(“key”)Stringkey){try{//当该键不存在时,异常redisTemplate.delete(key);return“Success”;}将不会引发catch(Exceptione){returne.get...

基于智能网卡(Smart Nic)的Open vSwitch卸载方案简介

SmartNic技术的初衷是以比普通CPU低得多的成本支持各种虚拟化功能,如sriov、overlay/decap和卸载一些vSwitch处理逻辑。目前,业界还没有完美的SmartNic解决方案来解决传统的vSwitch性能瓶颈,每种解决方案的实施方式也各不相同。没有统一的解决方案。图1.不同SmartNic架构的比较。2.基于SmartNic的OVS卸载方...

Github仓库重命名

1.在Github上重命名仓库,转到您自己的仓库,找到Setting标记,然后单击Options中的Settings以设置Repositoryname。2.修改本地仓库信息。由于远程仓库名称已更改,因此本地对应的仓库名称也应更改。1.检查当前远程仓库的信息$gitremote-v列出了所有远程仓库信息,包括网站地址。2.修改本地对应远程仓库的地址。修改后,使...

说说接口封装

今天,我为同事封装了一个接口。当谈到接口封装时,有很多关于它的讨论。在很多情况下,说一个服务好,一个服务坏,实际上是在吐槽服务团队之外暴露的界面质量。无论哪种语言,抽象的封装接口都由一个函数名、几个参数和几个返回值组成。总之,参数不应该被封装……我们在内部尝试接口_Catch不会抛出异常,所有信息都将以错误代码的形式返回。就php而言,建议进行异常处理。...