2015-06-04 71 views
0

我可以使用套接字recv函數讀取stdin的輸入流。 即讀取Ctrl-C。使用套接字recv函數讀取標準輸入流

贊。

int dummy; 

ssize_t bytes = recv (0 /* file descriptor for stdin*/ , &dummy, 1, MSG_PEEK); 

if (bytes > 0 && dummy == 0x03) 
return true; // Ctrl-C receive 
else 
return false;  // Not 

其實我使用龜etc功能通知CTRL-C讀取標準輸入流,但有時龜etc不通知任何CTRL-C。 如果我使用recv函數作爲與fgetc函數的分離,那麼每個通知CRTL-C的情況都將被處理。

所以我可以使用套接字recv函數來讀取stdin流嗎? 這是我通知CRTL-C事件的完整算法。

ssize_t bytes = recv (data->input, &dummy, 1, MSG_PEEK); 

dummy1 = fgetc (stdin) 

if ((dummy1 == 0x03) || (bytes > 0 && dummy == 0x03)) 
    return true; 
else 
    return false; 

回答

2

不,你不能使用非插座recv(至少不是可移植或常用)。 FWIW,在某些系統上,selectpoll可用於監測非插座包括標準輸入I/O事件,和讀/寫可以在插座等流可以使用,但RECV /發送是專門伯克利套接字API的一部分標準插座

控制-C往往產生信號(具體SIGINT)可以爲其註冊一個信號處理程序,但細節OS特定的。見例如this answer

+0

但我怎麼能使用ungetc函數或MSG_PEEK標誌像stdio上的讀/寫功能 – hmb

+0

我建議你使用'std :: cin''s ['peek'](http://en.cppreference.com/w/cpp/io/basic_istream/peek)和['putback'](http://en.cppreference.com/w/cpp/io/basic_istream/putback),以及'std :: cout'輸出,並且對標準輸入/標準輸出I/O不使用'read' /'write'。 –