linux - 在 MINIX 3.2 中从 Driver 向 TTY 发送消息

标签 linux unix posix ipc minix

我正在尝试读取用户的输入,在按下 g 的情况下,我输出“完成”,而按下任何其他按钮时,终端正常工作。我现在所拥有的是,当按下 g 时,它会打印完成,但我无法将消息传递给 tty 来继续处理。我当前的方法出现以下错误:“safecopy failed: granter 182819 failed: -106”

void kbd_interrupt(message *(m_ptr))
{
/* A keyboard interrupt has occurred.  Process it. */

    int isaux, x;void kbd_interrupt(message *(m_ptr))
{
/* A keyboard interrupt has occurred.  Process it. */

    int isaux, x;
    //puts("2");
    unsigned char scode;
    scan_keyboard(&scode, &isaux);
//printf("%d \n", DEV_IOCTL);
    x = (int) scode;
    m_ptr-> m_type = DEV_WRITE_S; //HARD_INT;//DEV_WRITE;
    m_ptr->TTY_LINE = KBDAUX_MINOR;
    m_ptr->USER_ENDPT=TTY_PROC_NR;

  if(scode ==34 | scode == 162) //190
    {
        printf(" DONE\n");
     //   sys_irqdisable(&irq_hook_id2);
        shut =1;
    }
    else
    {
    for(int i=0;i<1000;i++)
    {
    m_ptr->IO_GRANT=i;
//    printf("%d \n",i);
    //printf("%d %d\n",m_ptr->m_source, m_ptr->m_type);  
    send(5,m_ptr);
    }
    }
    return;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////scan_keyboard //////////////////////////////////
//////////////////////////////////////////////////////////////////////////
int scan_keyboard(bp, isauxp)
unsigned char *bp;
int *isauxp;
{
    unsigned long b;
    if(sys_inb(KEYBD, &b) != OK)
        printf("scan_keyboard: 2 sys_inb failed\n");
    //printf("got ACK from keyboard\n");
    if (bp)
      *bp= b; 
    return 1;
}


    //puts("2");
    unsigned char scode;
    scan_keyboard(&scode, &isaux);
//printf("%d \n", DEV_IOCTL);
    x = (int) scode;
    m_ptr-> m_type = DEV_WRITE_S; //HARD_INT;//DEV_WRITE;
    m_ptr->TTY_LINE = KBDAUX_MINOR;
    m_ptr->USER_ENDPT=TTY_PROC_NR;

  if(scode ==34 | scode == 162) //190
    {
        printf(" DONE\n");
     //   sys_irqdisable(&irq_hook_id2);
        shut =1;
    }
    else
    {
    for(int i=0;i<1000;i++)
    {
    m_ptr->IO_GRANT=i;
//    printf("%d \n",i);
    //printf("%d %d\n",m_ptr->m_source, m_ptr->m_type);  
    send(5,m_ptr);
    }
    }
    return;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////scan_keyboard //////////////////////////////////
//////////////////////////////////////////////////////////////////////////
int scan_keyboard(bp, isauxp)
unsigned char *bp;
int *isauxp;
{
    unsigned long b;
    if(sys_inb(KEYBD, &b) != OK)
        printf("scan_keyboard: 2 sys_inb failed\n");
    //printf("got ACK from keyboard\n");
    if (bp)
      *bp= b; 
    return 1;
}

最佳答案

好吧,在对 tty 驱动程序进行一些研究之后,我的队友发现消息类型应该不同才能将字母注入(inject)到 shell 中。所以下面是向tty发送消息的代码:

msg.m_type = INPUT_EVENT;
msg.INPUT_TYPE = INPUT_EV_KEY;
msg.INPUT_VALUE =1;
msg.INPUT_CODE = scode;
send(5, & msg);

scode 是之前检索到的字符代码,5 是 tty 驱动程序地址。 希望它能帮助某人:)

图片来源:艾哈​​迈德·巴西乌尼

关于linux - 在 MINIX 3.2 中从 Driver 向 TTY 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10566065/

相关文章:

c - 如何正确使用 posix_memalign

c posix 正则表达式验证输入 HH :MM:SS time string

linux - 如何在gedit上重做

c - 删除 root 权限

linux - Bash 比较目录中的字符串

c++ - 带有部分符号的遗留 proc C/C++ 代码(§)

c++ - 极其简单的 POSIX C++ IPC

linux - 您多久关闭一次 Linux 系统电源?

linux - 如何在 linux 中使用一个模式执行多个可执行文件

linux - 为什么两个进程同时使用一个java命令