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

目的:用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;
}else
printf("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, 1
simuate key 69, 0
(此处灯已亮,程序停2秒)
simuate key 69, 1
simuate key 69, 0
(此处程序已结束,灯仍亮)
(随便在键盘敲一个键,灯灭)

慕婉清6462132
浏览 284回答 2
2回答

大话西游666

不用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);}

慕尼黑的夜晚无繁华

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

相关分类

Java
CSS3