为了账号安全,请及时绑定邮箱和手机立即绑定

请教一下关于sleep和write函数相关的问题?麻烦大佬指点

请教一下关于sleep和write函数相关的问题?麻烦大佬指点

慕婉清6462132 2021-10-21 19:15:54
目的:用c语言模拟键盘输入,这里是按下NUMLOCK键,等待2秒后,再按一次。问题:如果不用sleep()函数,按1次或两次NUMLOCK键的程序,看到的NUMLOCK灯的状态与预期一致。当用了sleep()函数后,再运行程序,会看到NUMLOCK灯亮起,直至程序结束也不熄灭,这时再用手在键盘上随便按一个键,NUMLOCK灯才熄灭。代码:#include <linux/input.h>#include <time.h>#include <fcntl.h>#include <string.h>#include <errno.h>#include <stdio.h>#include <stdlib.h> #include <unistd.h>void simulate_key(int fd, unsigned int keycode, int keyvalue){struct input_event event;event.type = EV_KEY;event.code = keycode;event.value = keyvalue;gettimeofday(&event.time, 0);if (write(fd, &event, sizeof(event)) < 0) {printf("simulate key error\n");return;}elseprintf("simuate key %d, %d\n", keycode, keyvalue);}int main ( int argc, char *argv[] ){char *path = "/dev/input/event3";unsigned int key_code = KEY_NUMLOCK;if (argc >= 3) {path = argv[1];key_code = atoi(argv[2]);}else if (argc >= 2)path = argv[1];int fd_kbd = open(path, O_RDWR);if(fd_kbd <= 0) {printf("error open keyboard:%s\n", strerror(errno));return -1;}simulate_key(fd_kbd, key_code, 1);simulate_key(fd_kbd, key_code, 0);sleep(2);simulate_key(fd_kbd, key_code, 1);simulate_key(fd_kbd, key_code, 0);close(fd_kbd);return 0;} /* ---------- end of function main ---------- */运行结果:simuate key 69, 1simuate key 69, 0(此处灯已亮,程序停2秒)simuate key 69, 1simuate key 69, 0(此处程序已结束,灯仍亮)(随便在键盘敲一个键,灯灭)
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

不用sleep()函数, 4句 simulate_key() 执行太快,等于连续按了两次。看不见灯的亮灭。
你可以试用 for for 循环 来休息一会,不用 sleep().

windows 系统,用 sleep() 程序 能达预期效果:

#include <Windows.h>
#include <Winuser.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment (lib, "User32.lib")

main(int argc, char * argv[])
{
keybd_event(VK_NUMLOCK,1,0,0);
keybd_event(VK_NUMLOCK,1,KEYEVENTF_KEYUP,0);
Sleep(2000);
keybd_event(VK_NUMLOCK,1,0,0);
keybd_event(VK_NUMLOCK,1,KEYEVENTF_KEYUP,0);
}

查看完整回答
反对 回复 2021-10-24
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

貌似是缓冲区问题,你的虚拟按键指令都会到达键盘的缓冲区,随便敲个键,会造成键盘去处理缓冲区中的指令。之所以没能及时清空缓冲区,我猜可能还与设备的唤醒状态有关系,int fd_kbd = open(path, O_RDWR);设备处于清醒状态,随时清空缓冲区,执行sleep之后cpu不再等待keyboard去处理缓冲区了,忙别的去了,除非再次受到刺激(手动按键),cpu才会和keyboard重新建立联系,等待keyboard做一些事情。

查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 281 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信