请问如何让守护进程响应键盘事件(期待高手)

发布于 2022-07-16 06:17:53 字数 220 浏览 7 评论 9

大家好,我有个后台程序,需要知道用户的键盘事件,比如用户按了
F3键,后台程序就调用一个特定的程序。或者可以实现为键盘记录吧。

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

请大家出出主意,谢谢。

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

指尖凝香 2022-07-27 21:17:00

原帖由 john3851 于 2006-10-13 12:41 发表
read error 肯定是驱动有问题了,看看驱动程序的read函数,也可能你的驱动的poll函数没有写好,导致实际上没有数据可读但是也没有阻塞。

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

谢谢!!

静赏你的温柔 2022-07-27 21:12:04

read error 肯定是驱动有问题了,看看驱动程序的read函数,也可能你的驱动的poll函数没有写好,导致实际上没有数据可读但是也没有阻塞。

小草泠泠 2022-07-27 20:24:02

是呀,忘写FD_SET(STDIN_FILENO,&fd_read_set);了,改了又试了一下,
这回提示read error了,
而且文件/neteye/var/tmp/jianpan.txt也没有数据,这个可能是缓存没有刷新的问题.
但是read error又是什么原因呢?是不是标准输入已经被别的进程读取了?

谢谢了!

埋葬我深情 2022-07-27 20:15:07

你没有将标准输入加入fd_read_set中!
FD_SET(STDIN_FILENO,&fd_read_set);
试试看行不???

流云如水 2022-07-27 13:42:54

原帖由 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, "%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;
}

谢谢!!

沙沙粒小 2022-07-27 05:43:31

我想信号好像比较难实现,应该用select监听标准输入!

居里长安 2022-07-24 18:36:07

感觉要从内核里想办法,扑获所有的键盘事件,然后看看有没有需要的。

桃扇骨 2022-07-20 20:11:36

我自己回下,我想用信号来处理,可不知道键盘事件,对应什么信号 ?
期待高手..

自我难过 2022-07-16 23:01:39

我想是不是可以通过信号或者select标准输入?
但是不知道键盘会产生什么信号,
select能不能监控标准输入?
如果监控得到,能不能读取键盘输入?
还请高手指教!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文