QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2833|回复: 21

怎么样才能在不中断程序运行的情况下取得键盘的输入?

[复制链接]
发表于 2002-11-27 11:46:49 | 显示全部楼层 |阅读模式
如下面的程序。
[code:1]
main()
{
    while(1)
    {
        getchar();
        aa();
    }
}
[/code:1]
我是想让aa()这个函数不停的运行,但中间要查看键盘的输入。如果用getchar(),那么程序必须在键盘有输入时才能继续运行。但程序要求是不能中断,如果没有键盘输入,马上运行aa();在dos下使用dos的06H中断可以实现这个功能,但在linux我怎么实现?
发表于 2002-11-27 12:16:02 | 显示全部楼层
dos下有一个函数很好用(好像是bioskey),可惜在linux下我没找到对应的函数。你可以创建一个线程来专门拦截键盘输入,这样主线程就不会被阻塞了。
回复

使用道具 举报

 楼主| 发表于 2002-11-27 13:11:01 | 显示全部楼层
天,还这么麻烦啊,而且我还不会拦截呢。哪儿有相关的资料,今天上看了一个上午的资料,也没有找到。还有哪儿有linux系统呼叫的资料?我去找找,说不定有相关的呼叫。
回复

使用道具 举报

发表于 2002-11-27 13:16:01 | 显示全部楼层
用select判断是否有键盘输入
回复

使用道具 举报

发表于 2002-11-27 13:43:38 | 显示全部楼层
[quote:3ea120756e="solar"]用select判断是否有键盘输入[/quote]
能不能说详悉点。select是一个函数??在哪个头文件里?
回复

使用道具 举报

 楼主| 发表于 2002-11-27 13:54:28 | 显示全部楼层
selec可能不能符合要求,它是用来从多个文件描述符读取数据或者向多个文件描述符写入数据。万一在判断键盘输入之前有I/O操作,select能分清是哪一种i/o操作吗?我不大懂,指点一下。
回复

使用道具 举报

 楼主| 发表于 2002-11-27 13:57:31 | 显示全部楼层
要三个头文件
unistd.h,sys/time.h,sys/types.h
回复

使用道具 举报

发表于 2002-11-27 18:02:10 | 显示全部楼层
我把man select里的那个例子程序编译了一下,晕,select要回车才能知道有键盘输入。
回复

使用道具 举报

 楼主| 发表于 2002-11-28 07:21:11 | 显示全部楼层
我想linux提供的系统中断可能会有相应的功能。但是没有任何相关的资料。
回复

使用道具 举报

发表于 2002-11-28 19:38:18 | 显示全部楼层
用select函数完全可以做到这一点,下面这个程序以2.5秒为倒计时时间来读键盘。
[code:1]/*  Begin as usual with the includes and declarations
    and then initialize inputs to handle input from the keyboard.  */

#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main()
{
    char buffer[128];
    int result, nread;

    fd_set inputs, testfds;
    struct timeval timeout;

    FD_ZERO(&inputs);
    FD_SET(0,&inputs);

/*  Wait for input on stdin for a maximum of 2.5 seconds.  */

    while(1) {
        testfds = inputs;
        timeout.tv_sec = 2;
        timeout.tv_usec = 500000;

        result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, &timeout);

/*  After this time, we test result. If there has been no input, the program loops again.
    If there has been an error, the program exits.  */

        switch(result) {
        case 0:
            printf("timeout\n");
            break;
        case -1:
            perror("select");
            exit(1);

/*  If, during the wait, we have some action on the file descriptor,
    we read the input on stdin and echo it whenever an <end of line> character is received,
    until that input is Ctrl-D.  */

        default:
            if(FD_ISSET(0,&testfds)) {
                ioctl(0,FIONREAD,&nread);
                if(nread == 0) {
                    printf("keyboard done\n");
                    exit(0);
                }
                nread = read(0,buffer,nread);
                buffer[nread] = 0;
                printf("read %d from keyboard: %s", nread, buffer);
            }
            break;
        }
    }
}

[/code:1]
回复

使用道具 举报

 楼主| 发表于 2002-11-28 23:20:30 | 显示全部楼层
明天到单位好好看看这段代码。楼上的,无论怎么样,先谢谢你
回复

使用道具 举报

发表于 2002-11-29 09:20:52 | 显示全部楼层
[quote:6407b3e10e="kj501"]用select函数完全可以做到这一点,下面这个程序以2.5秒为倒计时时间来读键盘 。
[/quote]

我编译了你这个程序,可是我按一个健后必需回车才打印read n from keyboardxx
如果不按回车就一直打印timeout,这似乎没达到要求。
回复

使用道具 举报

 楼主| 发表于 2002-11-29 09:31:05 | 显示全部楼层
谢谢,编译了一下,正是我想要的,如果把时间改成0,不等待,那么就可以达到这个目标,如果没有操作,就直接做select下面的内容,如果有输入,就处理输入的内容。
别外想问一下,这个select对系统的资源占用率怎么样,也就是说效率怎么样?
回复

使用道具 举报

发表于 2002-11-29 11:02:25 | 显示全部楼层
timeout.tv_sec = 0;
        timeout.tv_usec = 0;
是这样吗??这样的话99%的CPU资源会被这个程序占用。而且我还是要回车程序才知道我有输入。要怎么改?比如我要写一个俄罗斯方块的游戏,总不能按完方向键后还要按一下回车吧!
回复

使用道具 举报

 楼主| 发表于 2002-11-29 11:19:25 | 显示全部楼层
[quote:addfccf88a="mozilla"]timeout.tv_sec = 0;
        timeout.tv_usec = 0;
是这样吗??这样的话99%的CPU资源会被这个程序占用。而且我还是要回车程序才知道我有输入。要怎么改?比如我要写一个俄罗斯方块的游戏,总不能按完方向键后还要按一下回车吧![/quote]
99%被占用是不会的,因为判断没有输入后,需要转入别的地方处理别的内容。
需要回车键这个问题当时我没有注意到,你提醒一下,想起来还是个大问题。
另外在问一下,window基于消息驱动,x server也是基于事件驱动。那text console下是基于什么驱动?另外,我想在text console下通过消息来控制另一个线程的运行,当被控制线程发现消息队列里为空是,这个线程是否会被阻塞?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 17:36 , Processed in 0.077816 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表