2014-01-11 19 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); 
} 
.... 
相关问题