內核層與用戶層信號異步通知問題

內核層與用戶層信號異步通知一定要用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只有一個,而且是最近的一個.

發佈了11 篇原創文章 · 獲贊 22 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章