请问如何让守护进程响应键盘事件(期待高手)
大家好,我有个后台程序,需要知道用户的键盘事件,比如用户按了
F3键,后台程序就调用一个特定的程序。或者可以实现为键盘记录吧。
但是既然是守护进程,它必定已经脱离了终端,就不会和屏幕,键盘这些输入输出交互。
所以这是一个矛盾。
请大家出出主意,谢谢。
[ 本帖最后由 myvm 于 2006-10-12 14:10 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
能不能说具体点?我对这方面不太懂,
你说的是系统的源码吗?
pool函数是干什么的?不好意思!
谢谢!!
read error 肯定是驱动有问题了,看看驱动程序的read函数,也可能你的驱动的poll函数没有写好,导致实际上没有数据可读但是也没有阻塞。
是呀,忘写FD_SET(STDIN_FILENO,&fd_read_set);了,改了又试了一下,
这回提示read error了,
而且文件/neteye/var/tmp/jianpan.txt也没有数据,这个可能是缓存没有刷新的问题.
但是read error又是什么原因呢?是不是标准输入已经被别的进程读取了?
谢谢了!
你没有将标准输入加入fd_read_set中!
FD_SET(STDIN_FILENO,&fd_read_set);
试试看行不???
楼上是说这样吗?可是我试了一下,不行呀,是不是有什么不对的地方?
#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, "%sn", "select STDIN_FILENO");
if((n = read(STDIN_FILENO, buf, 1024)) > 0){
if(fprintf(fp, "%sn", buf) == -1){
write(STDOUT_FILENO, "write errorn", 12);
}else{
write(STDOUT_FILENO, "read errorn", 11);
goto select_next;
}
}
}
}
fclose(fp);
return 0;
}
谢谢!!
我想信号好像比较难实现,应该用select监听标准输入!
感觉要从内核里想办法,扑获所有的键盘事件,然后看看有没有需要的。
我自己回下,我想用信号来处理,可不知道键盘事件,对应什么信号 ?
期待高手..
我想是不是可以通过信号或者select标准输入?
但是不知道键盘会产生什么信号,
select能不能监控标准输入?
如果监控得到,能不能读取键盘输入?
还请高手指教!