[問題] 序列埠正確close()後無法再正常工作

看板C_and_CPP (C/C++)作者 (flawless)時間7年前 (2018/12/30 20:25), 編輯推噓0(0011)
留言11則, 1人參與, 7年前最新討論串1/1
開發平台(Platform): GNU/Linux 編譯器: gcc 7.3.0 額外使用到的函數庫(Library Used): 無 問題(Question):初次開啟能正常運作,但程式關閉後再次開啟會卡在read函數 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):https://ideone.com/TzM5rD 補充說明(Supplement):程式功能為每秒印出從RS232收到的data的固定offset 的資料,目標裝置是不斷吐data而不接收的.使用ctrl+c 關閉程式時有handler去把序列埠的fd進行close(), 並 且有正確關閉(確定有回傳值0).比較好奇的是為什麼有正 確關閉但第二次開啟會卡在read(),而且open()是沒有 失敗的,目前解法都是重新插入裝置,然後裝置是使用 USB virtual port.還是我哪邊有漏考慮到了? 謝謝大家! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.208.17 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1546172712.A.212.html

12/30 21:04, 7年前 , 1F
補充 應該說每一秒收一次資料才對,一次收512 bytes
12/30 21:04, 1F

12/31 14:56, 7年前 , 2F
解決了, termios裡面有分canonical模式啟動與否,預設是
12/31 14:56, 2F

12/31 14:58, 7年前 , 3F
啟動的,它會對收到的data進行前處理,然後有鑑於我的裝置
12/31 14:58, 3F

12/31 15:00, 7年前 , 4F
送的data是0x00~0xff,而且termios在canonical模式下還會
12/31 15:00, 4F

12/31 15:02, 7年前 , 5F
對收到的資料進行SIG判斷,所以可能是剛好吃到suspend的
12/31 15:02, 5F

12/31 15:04, 7年前 , 6F
signal所以卡住了,話說還有這邊也有SIGINT,怎麼都那麼剛
12/31 15:04, 6F

12/31 15:05, 7年前 , 7F
好沒收到呢xd
12/31 15:05, 7F

12/31 15:05, 7年前 , 8F
另外貼一下相關manpage
12/31 15:05, 8F

12/31 15:06, 7年前 , 9F

12/31 15:07, 7年前 , 10F
關鍵字canonical, ISIG.然後cfmakeraw()這函數可以直接
12/31 15:07, 10F

12/31 15:07, 7年前 , 11F
開RAW mode, 省去一些手動關flag的動作.
12/31 15:07, 11F
文章代碼(AID): #1SABae8I (C_and_CPP)
文章代碼(AID): #1SABae8I (C_and_CPP)