linux下的系统调用eventfd

 这个系统调用可以创建一个类似管道的东西,但比管道更简单,它的读和写缓冲区只有8个字节,它会通过eventfd创建一个描述符fd,用于线程或进程间通信。简单来说,就是进程A被write一个n,那么进程B可以通过read读到这个n,当然在使用过程中,n是A和B之间协商的一个有意义的数字。看一下网上的代码就明白了

  
  
  
  
  1.  #include <sys/eventfd.h> 
  2. #include <unistd.h> 
  3. #include <stdio.h> 
  4. #include <stdint.h> 
  5. #include <stdlib.h> 
  6. #include <errno.h> 
  7.  
  8. #define handle_error(msg) \ 
  9.     do { perror(msg); exit(1); } while (0) 
  10.  
  11. int main( int argc, char **argv ) 
  12.     uint64_t u; 
  13.     ssize_t s; 
  14.     int j; 
  15.     if ( argc < 2 ) { 
  16.         fprintf(stderr, "input <num> in command argument"); 
  17.         exit(1); 
  18.     } 
  19.  
  20.     int efd; 
  21.     if ( (efd = eventfd(0, EFD_NONBLOCK)) == -1 ) 
  22.             handle_error("eventfd failed"); 
  23.  
  24.  
  25.     switch (fork()) { 
  26.         case 0: 
  27.             for( j = 1; j < argc; j ++ ) { 
  28.                 printf("Child writing %s to efd\n", argv[j] ); 
  29.              
  30.                 u = strtoull(argv[j], NULL, 0);  /* analogesly atoi */ 
  31.                 s = write(efd, &u, sizeof(uint64_t)); /* append u to counter */  
  32.                 if ( s != sizeof(uint64_t) ) 
  33.                     handle_error("write efd failed"); 
  34.  
  35.             } 
  36.             printf("child completed write loop\n"); 
  37.  
  38.             exit(0); 
  39.         default
  40.             sleep (2); 
  41.              
  42.             printf("parent about to read\n"); 
  43.             s = read(efd, &u, sizeof(uint64_t)); 
  44.             if ( s != sizeof(uint64_t) ) { 
  45.                 if (errno = EAGAIN) { 
  46.                     printf("Parent read value %d\n", s); 
  47.                     return 1; 
  48.                 } 
  49.                 handle_error("parent read failed"); 
  50.             } 
  51.             printf("parent read %d , %llu (0x%llx) from efd\n",  
  52.                     s, (unsigned long long)u, (unsigned long long) u); 
  53.             exit(0); 
  54.  
  55.         case -1: 
  56.             handle_error("fork "); 
  57.     } 
  58.     return 0; 

当在linux下网络编程的时候,可以用此fd去做线程间的通信或者唤醒事件分离器(select poll epoll_wait),类似iocp的PostQueuedCompletionStatus,但请注意,此函数在2.6.22内核版本以后有效。

你可能感兴趣的:(linux,职场,休闲,eventfd)