摘自: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。