2014-04-02 74 views
0

我使用ACE_OS::read_n()stdin (ACE_STDIN)讀取一些數據。我的代碼示例:ACE_OS :: read_n()返回0即使收到一些數據

ACE_Message_Block *head = new ACE_Message_Block(BUFSIZ); 
size_t bytes_trans = 0; 
ssize_t nbytes = ACE_OS::read_n(
    ACE_STDIN, 
    mblk->wr_ptr(), 
    mblk->size(), 
    &bytes_trans); 

如果我開始我的程序與命令./a.out <<< "hello",它的數據後發現EOF,並返回0。因此,我可以檢測接收的數據只有在檢查bytes_trans變量。

是否正確ACE_OS::read_n()行爲?

回答

1

只是看着ACE doxygen documentation

接收len個字節到來自BUF手柄(使用調用,它使用UNIX上的系統調用Win32上調用)。如果發生錯誤,則返回-1。如果發生EOF,則返回0。無論數據已讀出將通過bytes_transferred

被返回給調用者望着實現(請注意下面的代碼是從ACE 5.6.7 ...這就是我得心應手源)

ssize_t 
ACE_OS::read_n (ACE_HANDLE handle, 
       void *buf, 
       size_t len, 
       size_t *bt) 
{ 
    size_t temp; 
    size_t &bytes_transferred = bt == 0 ? temp : *bt; 
    ssize_t n = 0; 

    for (bytes_transferred = 0; 
     bytes_transferred < len; 
     bytes_transferred += n) 
    { 
     n = ACE_OS::read (handle, 
         (char *) buf + bytes_transferred, 
         len - bytes_transferred); 

     if (n == -1 || n == 0) 
     { 
      return n; 
     } 
    } 

    return ACE_Utils::truncate_cast<ssize_t> (bytes_transferred); 
} 

如此看來,它調用多次ACE_OS::read()積聚在bytes_transferred

接收的字節,如果一切順利的話,返回值將是相同的bytes_transferred 如果內容返回0或-1,read_n()將返回0或-1,並且bytes_transferred內容將是到目前爲止讀取的字節數。

+0

謝謝。即如果'read_n()'返回0,我們總是需要檢查bytes_transferred來檢測接收到的任何數據? – theDilletante

+0

@theDilletante請檢查我的最新編輯,我添加了可能對您有幫助的實施細節。 – jsantander

+0

謝謝!我現在知道了! – theDilletante

相關問題