簡體   English   中英

隨后使用STDIN和STDOUT

[英]Using STDIN and STDOUT subsequently

我正在用C編寫可以在終端中使用的聊天...

為了接收短信,我有一個線程可以在STDOUT上打印出該消息

另一個線程正在從標准輸入中讀取...

問題是,如果在鍵入時將新消息打印到stdout,它將在我鍵入的內容之間打印。

我研究了幾個小時的GNU readline實驗,以防止出現此問題。 我認為“重新顯示”功能將在這里為我提供幫助。.但是,如果我使用某些重新顯示功能(它表示ld:未定義符號),而其他功能正常運行,則無法在Mac OSX上編譯我的程序。一台Ubuntu機器就可以了...我真的不知道為什么...

但是,如何實現寫入stdout的所有內容都超過我當前正在編寫的文本?

您基本上有兩種解決方案。

第一種是使用可幫助您將屏幕分成不同部分的方法,正如@Banthar所說, ncurses是標准解決方案。

第二個是同步您的著作和閱讀。 從網絡讀取並寫入控制台的線程可能只是將消息推遲,直到您從鍵盤上輸入了內容為止,那時您可以通過一次寫入所有消息來刷新消息緩沖區。 注意:此解決方案可能會導致緩沖區溢出,您可能會忘記太舊的消息或在緩沖區已滿時刷新緩沖區。

如果您要求僅使用stdin和stdout(即啞終端),則必須首先將控制台輸入配置為沒有行緩沖,這是默認設置(在Unix之類的系統上,為stty -icanon )。 不幸的是,我找不到以編程方式實現此目標的可移植方式,但是您將在關於SO的另一個問題中找到更多關於此的方法, 如何避免使用任何getchar()的回車鍵

然后,您將必須逐字符整理下一個外發郵件。 因此,當准備在編寫輸出消息的過程中准備好傳遞輸入消息時,您可以跳上一行,編寫輸出消息(最終跳出另一行或執行通常的提示操作)並重寫輸入緩沖區,以便用戶准確輸入他已經輸入的所有字符。

您將必須使用一種互斥方式,以避免在輸出線程完成所有工作時,輸入線程可以對輸入緩沖區進行任何訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM