1. 对sleep()
、usleep()
进行测试
思路:正常来讲,系统调用的休眠函数会将整个线程挂起。而此时我们已经把休眠函数HOOK为我们自己实现的针对协程的的休眠,只会将协程挂起,而不会将线程也挂起。
内容:构建一个IO调度器IOManager
放入两个协程去运行,一个协程运行3s,另一个协程运行2s。如果在3s内两个协程都能运行完毕,说明休眠函数HOOK成功。否则,线程级别休眠,应该是5s才能运行完毕。
- 核心逻辑:
- 代码逻辑:
- 不开启HOOK情况下
整体执行时间为5s,即保留了线程的切换时间。主线程运行第一个任务花费2s,运行第二个任务花费3s。是以阻塞的形式完成运行的。
static Logger::ptr g_logger = KIT_LOG_ROOT();
int main()
{
KIT_LOG_DEBUG(g_logger) << "test begin";
IOManager iom("test", 1);
auto f1 = [](){
KIT_LOG_DEBUG(g_logger) << "f1 start";
sleep(2);
KIT_LOG_DEBUG(g_logger) << "f1 end";
};
auto f2 = [](){
KIT_LOG_DEBUG(g_logger) << "f2 start";
sleep(3);
KIT_LOG_DEBUG(g_logger) << "f2 end";
};
//SetHookEnable(true);
iom.schedule(f1);
iom.schedule(f2);
KIT_LOG_DEBUG(g_logger) << "test end";
return 0;
}
- 开启HOOK情况:
3s内两个协程执行完毕,说明HOOK成功,是将协程挂起而线程没有发生休眠。
static Logger::ptr g_logger = KIT_LOG_ROOT();
int main()
{
KIT_LOG_DEBUG(g_logger) << "test begin";
IOManager iom("test", 1);
auto f1 = [](){
KIT_LOG_DEBUG(g_logger) << "f1 start";
sleep(2);
KIT_LOG_DEBUG(g_logger) << "f1 end";
};
auto f2 = [](){
KIT_LOG_DEBUG(g_logger) << "f2 start";
sleep(3);
KIT_LOG_DEBUG(g_logger) << "f2 end";
};
//开启HOOK
SetHookEnable(true);
iom.schedule(f1);
iom.schedule(f2);
KIT_LOG_DEBUG(g_logger) << "test end";
return 0;
}
2. 对 socket API 进行测试
思路:构建一个简单的客户端,使用socket
连接百度的HTTP服务器,观察HOOK 情况
static Logger::ptr g_logger = KIT_LOG_ROOT();
#define PORT 80
#define ADDR "183.232.231.172" //百度服务器
void test_sock()
{
int fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd < 0)
{
KIT_LOG_ERROR(g_logger) << "socket error";
return;
}
struct sockaddr_in sockaddr;
bzero(&sockaddr, sizeof(struct sockaddr_in));
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(PORT);
sockaddr.sin_addr.s_addr = inet_addr(ADDR);
int ret = connect(fd, (struct sockaddr*)&sockaddr, sizeof(struct sockaddr));
if(ret < 0)
{
KIT_LOG_ERROR(g_logger) << "connect error";
return;
}
KIT_LOG_DEBUG(g_logger) << "connect ret = " << ret << ", errno = " << errno << ", is" << strerror(errno);
std::stringstream p;
p << "GET / HTTP/1.0\r\n\r\n";
ret = write(fd, (void *)p.str().c_str(), p.str().size());
std::string msg;
msg.resize(1024*1024);
ret = read(fd, &msg[0], msg.size());
KIT_LOG_DEBUG(g_logger) << "recv msg: " << msg;
}
int main()
{
KIT_LOG_DEBUG(g_logger) << "test begin";
IOManager iom("test_sock", 1);
iom.schedule(&test_sock);
KIT_LOG_DEBUG(g_logger) << "test end";
return 0;
}