免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5067 | 回复: 17
打印 上一主题 下一主题

请问如何让守护进程响应键盘事件(期待高手) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-11 15:45 |只看该作者 |倒序浏览
大家好,我有个后台程序,需要知道用户的键盘事件,比如用户按了
F3键,后台程序就调用一个特定的程序。或者可以实现为键盘记录吧。

但是既然是守护进程,它必定已经脱离了终端,就不会和屏幕,键盘这些输入输出交互。
所以这是一个矛盾。

请大家出出主意,谢谢。

[ 本帖最后由 myvm 于 2006-10-12 14:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-12 10:16 |只看该作者
我想是不是可以通过信号或者select标准输入?
但是不知道键盘会产生什么信号,
select能不能监控标准输入?
如果监控得到,能不能读取键盘输入?
还请高手指教!

论坛徽章:
0
3 [报告]
发表于 2006-10-12 14:10 |只看该作者
我自己回下,我想用信号来处理,可不知道键盘事件,对应什么信号 ?
期待高手..

论坛徽章:
0
4 [报告]
发表于 2006-10-12 16:52 |只看该作者
感觉要从内核里想办法,扑获所有的键盘事件,然后看看有没有需要的。

论坛徽章:
0
5 [报告]
发表于 2006-10-12 21:48 |只看该作者
我想信号好像比较难实现,应该用select监听标准输入!

论坛徽章:
0
6 [报告]
发表于 2006-10-13 08:35 |只看该作者
原帖由 zsniper 于 2006-10-12 21:48 发表
我想信号好像比较难实现,应该用select监听标准输入!


楼上是说这样吗?可是我试了一下,不行呀,是不是有什么不对的地方?

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

int main()
{
        fd_set fd_read_set, fd_write_set;
        int max_fd = 0;
        struct timeval timeout;
        int ret = -1;
        char buf[1024] = {0, };
        unsigned long        now_time = 0, start_time = 0;
        int n = 0;
        FILE *fp = NULL;
       
        fp = fopen("/neteye/var/tmp/jianpan.txt", "w");
        if(fp == NULL){
                        return -1;
        }
        while(1){
                FD_ZERO(&fd_read_set);
                FD_ZERO(&fd_write_set);
                timeout.tv_sec = 60 * 3;
                timeout.tv_usec = 0;
                max_fd = 0;
                max_fd = STDIN_FILENO;
                start_time = (unsigned long)time(NULL);
select_next:
                ret = select(max_fd + 1, &fd_read_set, 0, 0, &timeout);
               
                if (0 > ret){
                        if((errno == EINTR) || (errno == EWOULDBLOCK)) {
                                now_time = (unsigned long)time(NULL);
                                if((now_time - start_time) > 3 * 60){
                                        return ret;
                                }
                                goto select_next;
                        }
                        return ret;
                }
               
                if(FD_ISSET(STDIN_FILENO, &fd_read_set)){
                        fprintf(fp, "%s\n", "select STDIN_FILENO");
                        if((n = read(STDIN_FILENO, buf, 1024)) > 0){
                                if(fprintf(fp, "%s\n", buf) == -1){
                                        write(STDOUT_FILENO, "write error\n", 12);
                                }else{
                                        write(STDOUT_FILENO, "read error\n", 11);
                                        goto select_next;
                                }
                        }
                }
        }
        fclose(fp);
        return 0;
}

谢谢!!

论坛徽章:
0
7 [报告]
发表于 2006-10-13 09:53 |只看该作者
你没有将标准输入加入fd_read_set中!
FD_SET(STDIN_FILENO,&fd_read_set);
试试看行不???

论坛徽章:
0
8 [报告]
发表于 2006-10-13 11:35 |只看该作者
是呀,忘写FD_SET(STDIN_FILENO,&fd_read_set);了,改了又试了一下,
这回提示read error了,
而且文件/neteye/var/tmp/jianpan.txt也没有数据,这个可能是缓存没有刷新的问题.
但是read error又是什么原因呢?是不是标准输入已经被别的进程读取了?

谢谢了!

论坛徽章:
0
9 [报告]
发表于 2006-10-13 12:41 |只看该作者
read error 肯定是驱动有问题了,看看驱动程序的read函数,也可能你的驱动的poll函数没有写好,导致实际上没有数据可读但是也没有阻塞。

论坛徽章:
0
10 [报告]
发表于 2006-10-13 12:47 |只看该作者
原帖由 john3851 于 2006-10-13 12:41 发表
read error 肯定是驱动有问题了,看看驱动程序的read函数,也可能你的驱动的poll函数没有写好,导致实际上没有数据可读但是也没有阻塞。



能不能说具体点?我对这方面不太懂,
你说的是系统的源码吗?
pool函数是干什么的?不好意思!

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP