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";};//开启HOOKSetHookEnable(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;}

