我正在學習編寫linux設備驅動程序的阻塞I/O函數,我想知道ERESTARTSYS
的用法是什麼。考慮以下幾點:ERESTARTSYS在編寫linux驅動程序時使用了什麼?
全局變量:
wait_queue_head_t my_wait_q_head;
int read_avail = 0;
完Device_Init():
init_waitqueue_head(&my_wait_q_head);
device_read():
printk("I'm inside driver read!\n");
wait_event_interruptible(&my_wait_q_head, read_avail != 0);
printk("I'm awaken!\n");
device_write():
read_avail = 1;
wake_up_interruptible(&my_wait_q_head);
當我從用戶空間調用read()
,命令提示掛起,直到我打電話預期write()
如。消息printk
也相應地出現在dmesg
中。不過,我看到了一些這樣寫的驅動程序:
device_read()的另一個版本:
printk("I'm inside driver read!\n");
if(wait_event_interruptible(&my_wait_q_head, read_avail != 0))
{return -ERESTARTSYS;}
printk("I'm awaken!\n");
我測試使用用戶空間中的相同方法device_read()
的第二個版本,並且將結果是完全一樣的,那麼,ERESTARTSYS有什麼用?
P/S:我讀過這本書的Linux設備驅動程序,但我不明白這一點,可有人舉一個例子來eleborate?:
一旦我們把過去的這一號召,東西已經把我們喚醒了,但是我們不知道 是什麼。一種可能是該過程收到信號。如果包含wait_event_interruptible調用的語句包含 ,則檢查 。該聲明確保信號的適當和預期的反應 ,其可能已經負責喚醒 過程(因爲我們處於可中斷睡眠中)。如果信號有 到達,並且它沒有被進程阻塞,那麼適當的 行爲是讓內核的上層處理事件。到 爲此,驅動程序向調用者返回-ERESTARTSYS;該值爲 ,由虛擬文件系統(VFS)層在內部使用, 重新啓動系統調用或返回-EINTR到用戶空間。我們使用 相同類型的檢查來處理每個讀取操作的信號處理以及寫入實現的 。
來源:http://www.makelinux.net/ldd3/chp-6-sect-2
@Noge:爲了看清它們之間的區別,在過程調用read()之後,調用write()之前發送一個信號。 – caf 2012-03-06 03:09:15