test_aiocb.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 242 行

CPP
242
字号
// $Id: test_aiocb.cpp 78962 2007-07-20 03:27:14Z sowayaa $// ============================================================================//// = LIBRARY//    proactor//// = FILENAME//    test_aiocb.cpp//// = DESCRIPTION//    Checkout $ACE_ROOT/examples/Reactor/Proactor/test_aiocb_ace.cpp,//    which is the ACE'ified version of this program. // // = COMPILE and RUN//    % CC -g -o test_aiocb -lrt test_aiocb.cpp//    % ./test_aiocb// // = AUTHOR//    Alexander Babu Arulanthu <alex@cs.wustl.edu>//// ============================================================================//FUZZ: disable check_for_lack_ACE_OS#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <signal.h>#include <string.h>#include <errno.h>#include <stdio.h>#include <iostream.h>#include <aio.h>class Test_Aio{public:  Test_Aio (void);  // Default constructor.  int init (void);  // Initting the output file and the buffer.  int do_aio (void);  // Doing the testing stuff.  ~Test_Aio (void);  // Destructor.private:  int out_fd_;  // Output file descriptor.  struct aiocb *aiocb_write_;  // For writing to the file.  struct aiocb *aiocb_read_;  // Reading stuff from the file.  char *buffer_write_;  // The buffer to be written to the out_fd.  char *buffer_read_;  // The buffer to be read back from the file.};Test_Aio::Test_Aio (void)  : aiocb_write_ (new struct aiocb),    aiocb_read_ (new struct aiocb),    buffer_write_ (0),    buffer_read_ (0){}Test_Aio::~Test_Aio (void){  delete aiocb_write_;  delete aiocb_read_;  delete buffer_write_;  delete buffer_read_;}// Init the output file and init the buffer.intTest_Aio::init (void){  // Open the output file.  this->out_fd_ = open ("test_aio.log", O_RDWR | O_CREAT | O_TRUNC, 0666);  if (this->out_fd_ == 0)    {      cout << "Error : Opening file" << endl;      return -1;    }  // Init the buffers.  this->buffer_write_ = strdup ("Welcome to the world of AIO... AIO Rules !!!");  cout << "The buffer : " << this->buffer_write_ << endl;  this->buffer_read_ = new char [strlen (this->buffer_write_) + 1];  return 0;}// Set the necessary things for the AIO stuff.// Write the buffer asynchly.hmm Disable signals.// Go on aio_suspend. Wait for completion.// Print out the result.intTest_Aio::do_aio (void){  // = Write to the file.  // Setup AIOCB.  this->aiocb_write_->aio_fildes = this->out_fd_;  this->aiocb_write_->aio_offset = 0;  this->aiocb_write_->aio_buf = this->buffer_write_;  this->aiocb_write_->aio_nbytes = strlen (this->buffer_write_);  this->aiocb_write_->aio_reqprio = 0;  this->aiocb_write_->aio_sigevent.sigev_notify = SIGEV_NONE;  //this->this->aiocb_.aio_sigevent.sigev_signo = SIGRTMAX;  this->aiocb_write_->aio_sigevent.sigev_value.sival_ptr =    (void *) this->aiocb_write_;  // Fire off the aio write.  if (aio_write (this->aiocb_write_) != 0)    {      perror ("aio_write");      return -1;    }  // = Read from that file.  // Setup AIOCB.  this->aiocb_read_->aio_fildes = this->out_fd_;  this->aiocb_read_->aio_offset = 0;  this->aiocb_read_->aio_buf = this->buffer_read_;  this->aiocb_read_->aio_nbytes = strlen (this->buffer_write_);  this->aiocb_read_->aio_reqprio = 0;  this->aiocb_read_->aio_sigevent.sigev_notify = SIGEV_NONE;  //this->this->aiocb_.aio_sigevent.sigev_signo = SIGRTMAX;  this->aiocb_read_->aio_sigevent.sigev_value.sival_ptr =    (void *) this->aiocb_read_;  // Fire off the aio write. If it doesnt get queued, carry on to get  // the completion for the first one.  if (aio_read (this->aiocb_read_) < 0)    perror ("aio_read");    // Wait for the completion on aio_suspend.  struct aiocb *list_aiocb[2];  list_aiocb [0] = this->aiocb_write_;  list_aiocb [1] = this->aiocb_read_;  // Do suspend till all the aiocbs in the list are done.  int done = 0;  int return_val = 0;  while (!done)    {      return_val = aio_suspend (list_aiocb,                                2,                                0);      cerr << "Return value :" << return_val << endl;      // Analyze return and error values.      if (list_aiocb[0] != 0)        {          if (aio_error (list_aiocb [0]) != EINPROGRESS)            {              if (aio_return (list_aiocb [0]) == -1)                {                  perror ("aio_return");                  return -1;                }              else                {                  // Successful. Store the pointer somewhere and make the                  // entry NULL in the list.                  this->aiocb_write_ = list_aiocb [0];                  list_aiocb [0] = 0;                }            }          else            cout << "AIO write in progress" << endl;        }      if (list_aiocb[1] != 0)        {          if (aio_error (list_aiocb [1]) != EINPROGRESS)            {              int read_return = aio_return (list_aiocb[1]);              if (read_return == -1)                {                  perror ("aio_return");                  return -1;                }              else                {                  // Successful. Store the pointer somewhere and make the                  // entry NULL in the list.                  this->aiocb_read_ = list_aiocb [1];                  list_aiocb [1] = 0;                  this->buffer_read_[read_return] = '\0';                }            }          else            cout << "AIO read in progress" << endl;        }      // Is it done?      if ((list_aiocb [0] == 0) && (list_aiocb [1] == 0))        done = 1;    }  cout << "Both the AIO operations done." << endl;  cout << "The buffer is :" << this->buffer_read_ << endl;    return 0;}intmain (int argc, char **argv){  Test_Aio test_aio;  if (test_aio.init () != 0)    {      printf ("AIOCB test failed:\n"              "ACE_POSIX_AIOCB_PROACTOR may not work in this platform\n");      return -1;    }    if (test_aio.do_aio () != 0)    {      printf ("AIOCB test failed:\n"              "ACE_POSIX_AIOCB_PROACTOR may not work in this platform\n");       return -1;    }  printf ("AIOCB test successful:\n"          "ACE_POSIX_AIOCB_PROACTOR should work in this platform\n");  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?