0

ユーザーからの入力を読み取ろうとしていますが、 g が押された場合は「完了」を出力し、他のボタンが押された場合は端末が正常に動作します。私が今持っているのは、 g が押されたときに印刷が行われるということですが、メッセージをttyに渡して処理を続行することはできません。現在のアプローチで次のエラーが発生します:

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;
}
4

1 に答える 1

0

わかりましたので、tty ドライバーを調査した後、私のチームメイトは、シェルに文字を挿入するにはメッセージの種類が異なる必要があることを発見しました。以下は、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 ドライバーのアドレスです。それが誰かに役立つことを願っています:)

クレジット: Ahmed Bassiouny

于 2012-05-14T20:31:05.207 に答える