亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教一下關于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() 執行太快,等于連續按了兩次??床灰姛舻牧翜纭?br/>你可以試用 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 關注
  • 376 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號