亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
網(wǎng)絡(luò)編程中遇到fgets函數(shù)阻塞select函數(shù)問題
[打印本頁]
作者:
jye777
時間:
2015-08-23 12:22
標(biāo)題:
網(wǎng)絡(luò)編程中遇到fgets函數(shù)阻塞select函數(shù)問題
一個client程序:
select 超時監(jiān)聽 sockfd套接字 和 STDIN_FILENO標(biāo)準(zhǔn)輸入:若sockfd可讀則接收server報文;若標(biāo)準(zhǔn)輸入可讀(按下回車),則開始用fgets/fscanf等函數(shù)從標(biāo)準(zhǔn)輸入捕獲字符后發(fā)送給server;若select 2秒超時,client發(fā)送一次心跳包給server。
要求不能開其他的進程或線程,也不能使用定時器和信號,即單線程client
。
現(xiàn)在問題來了,在使用fgets/fscanf時,會阻塞select函數(shù),這樣一來client就無法進入超時流程發(fā)送心跳包;若將標(biāo)準(zhǔn)輸入設(shè)置為非阻塞,那么fgets/fscanf立即返回,捕獲的內(nèi)容為空,達(dá)不到要求。
請問,有沒有一種方法能讓程序一邊等待fgets/fscanf的捕獲,一邊循環(huán)非阻塞執(zhí)行select函數(shù)?
作者:
windoze
時間:
2015-08-23 12:27
你單獨開個thread去fgets不就好了。
作者:
lxyscls
時間:
2015-08-23 12:29
fd = fileno(FILE *)
把fd也掛select上面
沒用過,僅供參考
作者:
cokeboL
時間:
2015-08-23 12:44
不讓這,不讓那,還寫j毛代碼,去當(dāng)老板啊
作者:
jye777
時間:
2015-08-23 13:01
呵呵,不讓開其他線程,多線程當(dāng)然簡單
回復(fù)
2#
windoze
作者:
jye777
時間:
2015-08-23 13:02
哎,誰讓我們只是是碼農(nóng)啊,敢問有沒有思路
回復(fù)
4#
cokeboL
作者:
xinglp
時間:
2015-08-23 13:23
我都是開個netcat連上去
作者:
jye777
時間:
2015-08-23 13:59
標(biāo)準(zhǔn)輸入STDIN_FILENO已經(jīng)加入select監(jiān)聽
回復(fù)
3#
lxyscls
作者:
jye777
時間:
2015-08-23 14:06
暫時用不到這個
回復(fù)
7#
xinglp
作者:
windoze
時間:
2015-08-23 14:16
本帖最后由 windoze 于 2015-08-23 14:18 編輯
回復(fù)
5#
jye777
那你就只好不用fgets/fscanf了,自己實現(xiàn)一個fgets吧。
作者:
jye777
時間:
2015-08-23 17:42
回復(fù)
10#
windoze
用過linux下實現(xiàn)的kbhit,若沒有按鍵輸入則跳出這個函數(shù),有輸入則getchar到一個數(shù)組中存放然后退出函數(shù),若捕獲到回車鍵再把數(shù)組內(nèi)容填充到發(fā)送報文。這樣就是一個非阻塞的輸入函數(shù)。
case1:select還是監(jiān)聽標(biāo)準(zhǔn)輸入,只有按下回車鍵,程序才可能進入select的標(biāo)準(zhǔn)輸入可讀流程。這樣要想輸入一個字符必須先敲一個回車,顯然不行。
case2:select不監(jiān)聽標(biāo)準(zhǔn)輸入,在循環(huán)中,先執(zhí)行select,再執(zhí)行kbhit。這種方式能行,但是響應(yīng)太慢,因為select是2秒超發(fā)心跳,所以select是半阻塞的,也就是說要想執(zhí)行kbhit,必須等待2秒。
不知道版主所謂的非阻塞fgets和這個思路是一樣的否?感謝。
作者:
lxyscls
時間:
2015-08-23 18:01
回復(fù)
11#
jye777
行緩沖?不緩沖?你的描述來看是“行緩沖”,必須要回車,可以改成不緩沖的試試呢?
作者:
cokeboL
時間:
2015-08-23 19:41
自己實現(xiàn)個fgets。。。里面socket連接上發(fā)命令。。
作者:
jye777
時間:
2015-08-24 14:21
回復(fù)
12#
lxyscls
改成無緩沖的輸入確實是一種方法,多謝。
setvbuf(stdin, NULL, _IONBF, 0);
復(fù)制代碼
作者:
jye777
時間:
2015-08-24 14:33
method1:在進行select循環(huán)之前就把要輸入的內(nèi)容提前錄入,然后回車。之后程序進入到select的標(biāo)準(zhǔn)輸入可讀流程,在這里使用fgets將之前錄入的內(nèi)容全部讀入一個buf[],然后解析字符串,填入發(fā)送報文;
method2:將標(biāo)準(zhǔn)輸入流改為無緩沖方式(見14L),之后同method1;
兩種方式都能較好地解決單線程中fgets阻塞select/poll/epoll函數(shù)的問題。
作者:
jye777
時間:
2015-08-24 14:45
請問怎么關(guān)閉此貼啊,還是不用關(guān)?
作者:
windoze
時間:
2015-08-24 15:44
回復(fù)
15#
jye777
其實你不用關(guān)緩沖的,就用read/write加上select/epoll去讀寫stdio就好了,就當(dāng)stdio是socket,你的程序就沒問題了。
唯一的麻煩是這么一搞fgets也不能用了,你要用read/write從最底下實現(xiàn)一個fscanf。
作者:
jye777
時間:
2015-08-24 18:29
回復(fù)
17#
windoze
這樣確實弄麻煩了,請問版主需要手動關(guān)閉此貼嗎?
作者:
windoze
時間:
2015-08-25 02:28
回復(fù)
18#
jye777
你關(guān)它干嗎呢?問題不是還沒有完全解決嗎?放著吧。
作者:
jye777
時間:
2015-08-25 10:44
回復(fù)
19#
windoze
在15L已經(jīng)總結(jié)了兩種目前可行的兩種方法了,如果后續(xù)有人還有其它思路,可以繼續(xù)跟帖
作者:
windoze
時間:
2015-08-25 11:38
回復(fù)
20#
jye777
要說思路我倒是還有,不過有安利的嫌疑,不喜歡廣告的也別嫌棄就是了
我的
Fiberiozed.IO
里面就有針對你這種情況設(shè)計的功能,對stdio/stdout操作也可以變成異步的。
比如
echo server
例子里你就可以看到程序在異步處理并發(fā)鏈接的同時也處理了標(biāo)準(zhǔn)輸入輸出。
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2