2014-01-11 47 views
1

我正在實現一個充當fifo的模塊,以防止兩個進程訪問用於讀/寫i的緩衝區使用一個信號量,當一個信號量阻塞一個進程它將其移入等待隊列,我的問題是我如何檢查,如果這個進程是等待它收到一個信號,因爲如果它做到了,那麼我想停止什麼進程正在執行(讀取或寫入)並返回錯誤。 我熟悉的唯一功能是sigpending(sigset_t * set),但我不確定如何使用它,任何幫助將不勝感激。 (當我說讀/寫我的意思是在FOPS實施了該模塊的功能)我如何檢查一個進程是否在等待隊列中獲得信號linux 2.4

+0

你不能使用較新的內核?目前的是3.12.7和2.4於2006年發佈。 –

+0

不,這是我家庭作業的一部分,我需要使用確切版本2.4.18-14 –

回答

1

要允許在接收到信號休眠的任務被喚醒,設置任務狀態TASK_INTERRUPTIBLE,而不是TASK_UNINTERRUPTIBLE。 這種信號喚醒完全獨立於任何等待隊列,因此必須單獨檢查(使用signal_pending())。

一個典型的等待循環是這樣的:

DECLARE_WAITQUEUE(entry, current); 
... 
if (need_to_wait) { 
    add_wait_queue(&wq, &entry); 
    for (;;) { 
     set_current_state(TASK_INTERRUPTIBLE); 
     if (!need_to_wait) 
      break; 
     schedule(); 
     if (signal_pending(current)) { 
      remove_wait_queue(&wq, &entry); 
      return -EINTR; /* or -ERESTARTSYS */ 
     } 
    } 
    set_current_state(TASK_RUNNING); 
    remove_wait_queue(&wq, &entry); 
} 
.... 
相關問題