[問題] select 問題

看板C_and_CPP作者 (123)時間9年前 (2015/03/19 17:38), 編輯推噓5(509)
留言14則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) android jni c++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 小弟最近使用android 的jni 寫 c的 socket 我是client端 除了主執行緒外開了一條thread , 用select傳入NULL去咬住等資料進來 (不設timeout) 但當我要結束連線的時候 select函數仍然咬著 主執行緒切不斷 請問有無方法在主執行緒 讓這個select wake up 然後再斷線 ? 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) res = select(sockfd + 1, &infd, &outfd, &errfd, NULL); 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.31.81 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1426757905.A.8D6.html

03/19 17:49, , 1F
如果要用 blocking I/O,已經開 thread 就直接 recv 吧
03/19 17:49, 1F

03/19 17:50, , 2F
不曉得那些是 blocking 的 fd 還是 non-blocking 的 fd
03/19 17:50, 2F

03/19 17:52, , 3F
一般是 select 搭配 timeout + while loop with flag
03/19 17:52, 3F

03/19 17:54, , 4F
真的要暴力停止的話,可以送一個 signal 給該 thread
03/19 17:54, 4F

03/19 18:00, , 5F
此時 select 就應該會退出 blocking state,返回 EINTR
03/19 18:00, 5F

03/19 18:18, , 6F
推文一請忽略,我想你應該是要等待一個以上的 fd :P
03/19 18:18, 6F

03/19 23:43, , 7F
實作一個data controler, if(open(temp_control))
03/19 23:43, 7F

03/19 23:43, , 8F
送signal給thread, select自然就會跳出來了
03/19 23:43, 8F

03/19 23:53, , 9F
記得 Android 上也有 pselect,用 pselect 更方便處理
03/19 23:53, 9F

03/19 23:53, , 10F
這兒有完整的範例程式碼 http://goo.gl/H2DkXm
03/19 23:53, 10F

03/19 23:54, , 11F
加個dummy/signal sockfd到infd, send data讓select被trig
03/19 23:54, 11F

03/19 23:54, , 12F
ger
03/19 23:54, 12F

03/20 01:14, , 13F
select要用signal殺 不過既然都用C++了 用asio吧
03/20 01:14, 13F

03/20 17:44, , 14F
謝謝各位大大!
03/20 17:44, 14F
文章代碼(AID): #1L2faHZM (C_and_CPP)