LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1190|回复: 0

我的AIO测试程序

[复制链接]
发表于 2009-11-4 12:00:18 | 显示全部楼层 |阅读模式
看过realtang写的aio程序,确实很棒,代码很精简。

这是我的测试用例,分享一下
  1. #include <aio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <netinet/in.h>
  7. #include <sys/socket.h>
  8. #include <arpa/inet.h>
  9. #include <signal.h>
  10. #include <sys/wait.h>
  11. #include <string.h>
  12. #include <errno.h>
  13. #define SA struct sockaddr
  14. #define LISTENPORT 8888
  15. #define BACKLOG 1024
  16. /* 编译的时候加 -lrt 参数 real-time 库 */
  17. static char buf[BUFSIZ];
  18. static struct aiocb aio;
  19. static connfd;            /* connection socket descriptor */
  20. static global_quit_flag;
  21. void signal_handler(void);
  22. void sig_chld(int signo);
  23. void sig_io(int signo);
  24. int create_listenfd(void);
  25. void do_loop(int listenfd);
  26. void do_request(void);
  27. void init_aio(void);
  28. void err_sys(const char *errmsg);
  29. int main(void)
  30. {   
  31.         int listenfd;
  32.         signal_handler();
  33.         listenfd = create_listenfd();
  34.         do_loop(listenfd);
  35.         exit(0);
  36. }
  37. void signal_handler(void)
  38. {
  39.         struct sigaction sigio_act, sigchld_act;
  40.         sigio_act.sa_handler = sig_io;   
  41.         sigio_act.sa_flags = 0;   
  42.         if (sigemptyset(&sigio_act.sa_mask) == -1)
  43.                 err_sys("sigemptyset");   
  44.         else if (sigaction(SIGIO, &sigio_act, NULL) == -1)
  45.                 err_sys("sigaction");
  46.         sigchld_act.sa_handler = sig_chld;
  47.         sigchld_act.sa_flags = 0;
  48.         if (sigemptyset(&sigchld_act.sa_mask) == -1)
  49.                 err_sys("sigemptyset");
  50.         else if (sigaction(SIGCHLD, &sigchld_act, NULL) == -1)
  51.                 err_sys("sigaction");
  52. }
  53. int create_listenfd(void)
  54. {
  55.         int listenfd;
  56.         struct sockaddr_in servaddr;
  57.         if ((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
  58.                 err_sys("socket");
  59.         bzero(&servaddr, sizeof(servaddr));
  60.         servaddr.sin_family = AF_INET;
  61.         servaddr.sin_port = htons(LISTENPORT);
  62.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);    /* wildcard address */
  63.         if (bind(listenfd, (SA *)&servaddr, sizeof(servaddr)) == -1)
  64.                 err_sys("bind");
  65.         else if (listen(listenfd, BACKLOG) == -1)
  66.                 err_sys("listen");
  67.         return listenfd;
  68. }
  69. void do_loop(int listenfd)
  70. {
  71.         pid_t pid;
  72.         for (;;) {        /* forever process client request */
  73.                 if ((connfd = accept(listenfd, NULL, NULL)) == -1) {
  74.                         if (errno == EINTR)
  75.                                 continue;
  76.                         else
  77.                                 err_sys("accept");
  78.                 }
  79.                 if ((pid = fork()) == -1)
  80.                         err_sys("fork");
  81.                 else if (pid == 0) {        /* child process */
  82.                         if (close(listenfd) == -1)
  83.                                 err_sys("close");
  84.                         do_request();   
  85.                         for (;;) {
  86.                                 if (global_quit_flag == 1)
  87.                                         break;    /* jump out loop */
  88.                                 pause();
  89.                         }
  90.                         exit(0);
  91.                 }
  92.                 if (close(connfd) == -1)
  93.                         err_sys("close");
  94.         }
  95. }
  96. void do_request(void)
  97. {
  98.         init_aio();        
  99.         if (aio_read(&aio) == -1)
  100.                 err_sys("aio_read");
  101. }
  102. void init_aio(void)
  103. {
  104.         aio.aio_fildes = connfd;
  105.         aio.aio_offset = 0;
  106.         aio.aio_buf = buf;
  107.         aio.aio_nbytes = BUFSIZ;
  108.         aio.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
  109.         aio.aio_sigevent.sigev_signo = SIGIO;
  110.         aio.aio_sigevent.sigev_value.sival_ptr = &aio;
  111. }
  112. void sig_chld(int signo)
  113. {   
  114.         while (waitpid(-1, NULL, WNOHANG) > 0)
  115.                 /* wait child process */;
  116. }
  117. void sig_io(int signo)
  118. {
  119.         int n;
  120.         if (aio_error(&aio) == 0) {        /* I/O execute complete */
  121.                 n = aio_return(&aio);
  122.                 if (n == 0) {
  123.                         global_quit_flag = 1;    /* client close connection */
  124.                         return ;
  125.                 }
  126.                 if (send(connfd, (char *)aio.aio_buf, n, 0) != n)
  127.                         err_sys("send");
  128.                 do_request();
  129.         }
  130. }
  131. void err_sys(const char *errmsg)
  132. {
  133.         perror(errmsg);
  134.         exit(1);
  135. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表