私は本当に奇妙な問題のために髪を引っ張ってきました。カーネル モジュールは、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);
}