libevent入门(1),libevent入门
libevent入门(1),libevent入门
libevent是什么 libevent 库实际上没有更换select()
、poll()
或其他机制的基础。而是使用对于每个平台最高效的高性能解决方案在实现外加上一个包装器。
为了实际处理每个请求,libevent 库提供一种事件机制,它作为底层网络后端的包装器。事件系统让为连接添加处理函数变得非常简便,同时降低了底层 I/O 复杂性。这是 libevent 系统的核心。
通俗的说,libevent是select、poll、epoll等机制的一种封装,使网络编程更方便、减低网络编程的复杂性。
libevent有以下特点:
可移植性:
使用libevent库编写的程序可以运行在所有支持libevent的平台,即时是在不支持非阻塞IO的平台上,libevent库也可以支持一般的IO工作方法。
高效:
使用libevent库编写的程序会使用每个平台最高效的非阻塞IO模型,而不是引入过多的其他的IO机制。
伸缩性强:
使用libevent库编写的程序可以处理大量的网络连接。
便捷性:
libevent是对底层IO机制的封装,可以编写统一的程序,降低IO程序编写的复杂性。
怎么使用libevent
libevent总体API调用过程如下:
(1)event_base_new() //初始化一个event_base
(2)event_set() //初始化一个event(事件)结构体,设置事件的文件描述符、事件类型(读IO事件或者写IO事件等)、事件被触发后的回调函数、回调函数的参数
(3)event_base_set() //给事件设置相应的event_base
(4)event_add() //把事件添加到队列(就绪队列、active队列等),队列由event对应的event_base管理
(5)event_base_dispatch() //启动轮询
event_base和event是一对多的关系,一个event_base管理着多个event。
1 int main() 2 { 3 4 int serFd; 5 struct sockaddr_in serAddr; 6 7 memset(&serAddr, 0, sizeof(serAddr)); 8 serAddr.sin_family = AF_INET; 9 serAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 10 serAddr.sin_port = htons(8888); 11 12 13 serFd = socket(AF_INET, SOCK_STREAM, 0); 14 bind(serFd, (struct sockaddr*)&serAddr, sizeof(serAddr)); 15 listen(serFd, 10); 16 17 //初始化一个event_base 18 base = event_base_new(); 19 20 struct event listenEvent; 21 22 //初始化一个event(事件)结构体,设置事件的文件描述符、事件类型(读IO事件或者写IO事件等)、 23 //事件被触发后的回调函数onAccept【该函数需要我们自己实现】、回调函数的参数 24 //EV_PERSIST表示事件的回调函数执行完后,不会把事件listenEvent从base中移除 25 event_set(&listenEvent, serFd, EV_READ|EV_PERSIST, onAccept, NULL); 26 27 //给listenEvent事件设置相应的event_base 28 event_base_set(base, &listenEvent); 29 30 //把事件添加到队列(就绪队列、active队列等),队列由event对应的event_base管理 31 event_add(&listenEvent, NULL); 32 33 //启动轮询 34 event_base_dispatch(base); 35 36 return 0; 37 }
回调函数:
1 //回调函数包含三个参数 2 //参数1:事件对应的文件描述符 3 //参数2:事件对应的行为 EV_READ|EV_PERSIST 4 //参数3:在event_set函数传入的参数的指针 5 void onAccept(int serFd, short iEvent, void *arg) 6 { 7 //listenEvent事件的回调函数 8 }
图1中,y--是先进行运算,再执行自减,--y是先自减,再进行运算
故图1中y最后一次循环时y为1,进行while(--y)判断,此时--y先自减 ,变为0,再判断。跳出循环,此时y为0,下面输出时,由于是y--,故先执行输出y,也就是0,再进行自减,y变为-1。
故输出时y的值为0,printf后为-1,答案为0,D
图2
。。。印刷不规范 (n) 1! = 1*0!, (n)是标号,和上面的(1)和(2)对应 ,下面的(n+1)一样是标号。分别表示推倒到第n步和第n+1步。
上面红色框体中的都是标号
附加阶乘递归求解C程序
#include <stdio.h>
int main()
{
int n;
printf("Input n:");
scanf("%d",&n);
long f(int);
printf("%ld",f(n));
return 0;
}
long f(int n)
{
if(n==0)
return 1;
else
return n*f(n-1);
}
不知道是什么软件。。。
通常AIX下安装软件,如果是光盘,smit install,选CD就可以。还有些是直接执行,先建个CDROM文件系统并mount,然后进去,看有什么可执行的,./install或其他什么的。
评论暂时关闭