當前位置:首頁 » 編程語言 » c語言阻塞函數

c語言阻塞函數

發布時間: 2022-09-06 14:01:01

⑴ 求高手 詳解阻塞函數與非阻塞函數的區別。再解釋一下getch()和kbhit()的組合應用實例詳解

阻塞
阻塞調用是指調用結果返回之前,當前線程會被掛起。函數只有在得到結果之後才會返回。有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同
步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。例如,我們在CSocket中調用Receive函數,如果緩沖區中沒有數
據,這個函數就會一直等待,直到有數據才返回。而此時,當前線程還會繼續處理各種各樣的消息。如果主窗口和調用函數在同一個線程中,除非你在特殊的界面操
作函數中調用,其實主界面還是應該可以刷新。socket接收數據的另外一個函數recv則是一個阻塞調用的例子。當socket工作在阻塞模式的時候,
如果沒有數據的情況下調用該函數,則當前線程就會被掛起,直到有數據為止。
非阻塞
非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。
getch():
所在頭文件:conio.h
函數用途:從控制台讀取一個字元,但不顯示在屏幕上
函數原型:int getch(void)
返回值:讀取的字元
例如:
char ch;或int ch;
getch();或ch=getch();
用getch();會等待你按下任意鍵,再繼續執行下面的語句;
用ch=getch();會等待你按下任意鍵之後,把該鍵字元所對應的ASCII碼賦給ch,再執行下面的語句。
易錯點:
1.所在頭文件是conio.h。而不是stdio.h。
2.在使用之前要調用initscr(),結束時要調用endwin()。否則會出現不輸入字元這個函數
也會返回的情況。
3.在不同平台,輸入回車,getch()將返回不同數值,而getchar()統一返回10(即\n)
1)windows平台下ENTER鍵會產生兩個轉義字元 \r\n,因此getch返回13(\r)。
2)unix、 linux系統中ENTER鍵只產生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER鍵將產生 \r ,因此getch返回13(\r)。
getch();並非標准C中的函數,不存在c語言中。所以在使用的時候要注意程序的可移植性。國內C語言新手常常使用getch();來暫停程序且不知道此函數來源,建議使用getchar();(如果情況允許)代替此功能或更換一款編譯器。
kbhit()(VC++6.0下為_kbhit())
功 能及返回值: 檢查當前是否有鍵盤輸入,若有則返回一個非0值,否則返回0
用 法:int kbhit(void);
包含頭文件: include <conio.h>
編輯本段程序示例
C語言
#include<conio.h>
int main(void)
{
cprintf("Press any key to continue:");
while (!kbhit()) /* do nothing */ ;
cprintf("\r\nA key was pressed...\r\n");
return 0;
}
下面的代碼,如果沒有鍵盤輸入程序一直輸出Hello World,直到用戶按Esc結束
#include <conio.h>
#include <stdlib.h>
int main( void )
{
char ch;
while( !kbhit() )
{
cprintf("Hello World\n");
if( kbhit() )
ch = getch();
if( 27 == ch )
break;
}
cprintf("End!\n");
system("pause");
return 0;
}
C++語言
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
while(!kbhit()) //當沒有鍵按下
{
cout<<"無鍵按下"<<endl;
}
cout<<"有鍵按下"<<endl; //有鍵按下時輸出這
system("pause");
}
kbhit() 在執行時,檢測是否有按鍵按下,有按下返回非0值,一般是1
沒有按下返回0;是非阻塞函數
getch() 在執行時,檢測按下什麼鍵,如果不按鍵該函數不返回;是阻塞函數
類似地
在Tc2.0中有一個處理鍵盤輸入的函數bioskey();
int bioskey(int cmd);
當cmd為1時,bioskey()檢測是否有鍵按下。沒有鍵按下時返回0;有鍵按下時返回按鍵碼(
任何按鍵碼都不為0),但此時並不將檢測到的按鍵碼從鍵盤緩沖隊列中清除。 是非阻塞參數。
當cmd為0時,bioskey()返回鍵盤緩沖隊列中的按鍵碼,並將此按鍵碼從鍵盤緩沖隊列中清
除。如果鍵盤緩沖隊列為空,則一直等到有鍵按下,才將得到的按鍵碼返回。是阻塞調用。
//個人理解kbhit()有點像bioskey(1)

⑵ 《c語言》中select函數的作用是什麼

selcet函數是一個輪循函數,即當循環詢問文件節點,可設置超時時間,超時時間到了就跳過代碼繼續往下執行。

select()的機制中提供一fd_set的數據結構,實際上是一long類型的數組, 每一個數組元素都能與一打開的文件句柄(不管是Socket句柄,還是其他 文件或命名管道或設備句柄)建立聯系,建立聯系的工作由程序員完成, 當調用select()時,由內核根據IO狀態修改fd_set的內容,由此來通知執 行了select()的進程哪一Socket或文件可讀或可寫。主要用於Socket通信當中。

⑶ 請問Linux下使用C語言編程如何實現進程的阻塞

你的想法對於單一進程是行不通的,因為一旦進程「阻塞」了,變數的值又怎麼可能自己改變呢?

如果你談的是多進程(或線程),那有很多方法可以使用。但恐怕你不是在進行多進程編程,因為這是多進程編程的最基本概念。如果連這些都未掌握,你根本沒辦法進行下去,更不用設計什麼變數i變數j的了。

⑷ C語言高手來解答,怎麼實現進程阻塞的函數謝謝啦。

看你提出的問題,應該自己有一部分代碼了,我還是先提思路吧。 你需要一個阻塞隊列,需要阻塞的進程放入阻塞隊列,這個隊列用單向鏈表即可。 然後再進程調度的間隙掃描阻塞隊列,看有沒有需要解除阻塞的進程,如果有將其從阻塞隊列摘除,掛入就緒隊列。

⑸ C語言 getch() 為什麼會阻塞,,

getch();並非標准C中的函數,不存在C語言中。!!
所在頭文件:conio.h
建議換成getchar()之類的
getch()
getch():
所在頭文件:conio.h
函數用途:從控制台讀取一個字元,但不顯示在屏幕上
函數原型:int
getch(void)
返回值:讀取的字元
例如:
char
ch;或int
ch;
getch();或ch=getch();
用getch();會等待你按下任意鍵,再繼續執行下面的語句;
用ch=getch();會等待你按下任意鍵之後,把該鍵字元所對應的ASCII碼賦給ch,再執行下面的語句。
易錯點:1.所在頭文件是conio.h。而不是stdio.h。
2.在使用之前要調用initscr(),結束時要調用endwin()。否則會出現不輸入字元這個函數
也會返回的情況。
getch();並非標准C中的函數,不存在C語言中。所以在使用的時候要注意程序的可移植性。國內C語言新手常常使用getch();來暫停程序且不知道此函數來源,建議使用getchar();(如果情況允許)代替此功能或更換一款編譯器。

⑹ 阻塞隊列,C語言高手來解答,怎麼實現進程阻塞的函數

當然可以,定義成全局變數或者在定義的那個函數返回此隊列把此返回的隊列作為實參傳遞給另一個函數

熱點內容
如何開張一個租賃伺服器 發布:2024-10-18 11:46:13 瀏覽:825
python解析json文件 發布:2024-10-18 11:29:34 瀏覽:310
編譯程序的生成程序 發布:2024-10-18 11:29:27 瀏覽:403
軌跡處理演算法 發布:2024-10-18 11:22:25 瀏覽:782
支付密碼怎麼破解 發布:2024-10-18 11:09:19 瀏覽:144
線性鏈表c語言 發布:2024-10-18 11:09:17 瀏覽:784
淘寶賣的腳本可靠嗎 發布:2024-10-18 10:54:04 瀏覽:119
數質數演算法 發布:2024-10-18 10:53:26 瀏覽:281
安卓11有的地方怎麼那麼卡 發布:2024-10-18 10:53:21 瀏覽:478
蘋果怎麼設置程序加密 發布:2024-10-18 10:52:41 瀏覽:101