內核層與用戶層信號異步通知一定要用SIGIO信號嗎 ?
若是 步驟如下:
1 A device driver 檢測GPIO A通過SIGIO通知用戶層
2 B device driver 檢測GPIO B也通過SIGIO通知用戶層
3 用戶進程C 先打開device A 註冊信號SIGIO信號handle handle_A
然後進程C 再打開deviceB 註冊信號SIGIO信號handle handle_B
那麼問題來了, 在同一個進程內不可能有2個相同的信號handle. 那麼一個進程需要接受2個device的異步通信如何實現呢?
同時, 如果要用其他信號如SIGUSR1那些信號,如何從內核層通知到用戶層呢?
1、一個進程接受多個driver的通知的問題:
應用程序藉助select或poll來確定輸入的來源。 ko
2、一個driver通知多個進程的問題:
多個進程如果是進程組,那可以直接通知這個進程組。如果不是同一個進程組,這個問題可能用等待隊列實現比較好。????
我查了一下,至於多個進程都需要異步通知的情況,各自注冊爲異步通知就可以了,當數據到達時,所有進程都將被通知到。"
"看一下ldd3第169頁異步通知的說明:
“爲了啓用文件異步通知機制,用戶程序必須執行兩個步驟。首先,他們指定一個進程作爲文件的“屬主(owner)”。當進程使用fcntl系統調用執行 F_SETOWN命令時,屬主進程的進程ID號就被保存在filp->f_owner中。這一步是必須的,目的是爲了讓內核知道應該通知哪個進程。……”"
我覺得filp->f_owner只有一個,所以多個進程在需要同一個異步通知的話是不可能的.
我做了一個test
引用:
void test_handler(int sigum)
{
int value;
printf("pid %d the test sigum = %d./n",getpid(), sigum);
}
int main(void)
{
int retval;
int fd;
int ts, maxfd;
int ret = 0, i, j;
unsigned char number;
int oflags;
int fd2;
fd = open("/dev/key", O_RDWR); //|O_NONBLOCK);
if (fd == -1) {
printf("open device errr!/n");
return 0;
}
signal(SIGIO, test_handler);
fcntl(fd, F_SETOWN, getpid());
oflags = fcntl(fd,F_GETFL);
fcntl(fd, F_SETFL, oflags | FASYNC);
while (1) {
read(fd, &number, 1);
printf("key=%d 0x%x/n",number, number);
sleep(5);
}
close(fd);
return 0;
}
步驟如下
1. 首先加載模塊拉
2 ./test &
3 按鍵 這個test收到信號
pid 300 the test sigum = 29.
4 ./test & //增加一個進程
5 按鍵 這個test收到信號
pid 301 the test sigum = 29.
6 ./test & //增加一個進程
7 按鍵 這個test收到信號
pid 302 the test sigum = 29.
所以說filp->f_owner只有一個,而且是最近的一個.