当前位置:首页 » 编程语言 » 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语言高手来解答,怎么实现进程阻塞的函数

当然可以,定义成全局变量或者在定义的那个函数返回此队列把此返回的队列作为实参传递给另一个函数

热点内容
android发送at指令 发布:2024-10-18 13:14:18 浏览:658
安卓手机哪个工艺最好 发布:2024-10-18 13:01:43 浏览:282
源程序编译过程中装配器 发布:2024-10-18 13:01:43 浏览:118
如何查询服务器的序列号 发布:2024-10-18 12:57:04 浏览:670
钻石脚本 发布:2024-10-18 12:56:59 浏览:852
用命令创建数据库 发布:2024-10-18 12:56:01 浏览:529
sqlserver2008维护 发布:2024-10-18 12:54:44 浏览:79
全款查封带大本未解压 发布:2024-10-18 12:51:34 浏览:943
安卓机如何使用苹果的流量 发布:2024-10-18 12:51:24 浏览:934
中国电脑服务器的发展 发布:2024-10-18 12:31:38 浏览:778