1

私は本当に奇妙な問題のために髪を引っ張ってきました。カーネル モジュールは、printk なしではユーザー アプリケーションにシグナルを送信できません (またはユーザー アプリは受信できません)。シグナルの送信後または送信前に、ダミーの printk を実行する必要があります。

実際、空のprintkでもうまく機能します。しかし、私は何が起こっているのかを理解しようとしています。

何かご意見は?

何が起こっているかは次のとおりです。

A - カーネル) Char デバイス タイプ モジュールが割り込みを取得します。

データを抽出し、ユーザーに信号を送信します。

/* ここで printk を行う必要があります */

IRQ ハンドルを返します。

B-ユーザー)

信号を受信します。

システム コールを発行し、char デバイスの buffer からデータを読み取ります。(copy_to_user)

カーネル:

void irq_handler(){
    int i;
    for(i =0; i < 32; i++) 
        GPIOdata[i] = read_gpio_status(i);

    struct task_struct *p = find_task_by_pid(processinfo.pid);
    if (NULL == p) 
        return;
    send_sig(SIGUSR1, p, 0);
    /* have to add printk here */
    return IRQ_HANDLED
}

ユーザー:

void signal_handler(int sig) {
    char data[32];
    ioctl(fd, READ_Data_from_Char_device, &data);
}
4

1 に答える 1