2014-01-11 1 views
1

Я реализую модуль, который действует как fifo, чтобы предотвратить доступ двух процессов к буферу, который используется для чтения/записи i использовал семафор, когда семафор блокирует процесс, он перемещает его в очередь ожидания, мой вопрос в том, как я могу проверить, если в то время как этот процесс , ожидающий, он получил сигнал, потому что если бы это произошло, я бы хотел остановить то, что когда-либо было процесс (чтение или запись) и возврат ошибки. Единственная функция, с которой я знаком, это sigpending (sigset_t * set), но я не уверен, как ее использовать, любая помощь будет оценена. (когда я говорю чтение/записи я имею в виду функцию, которая была реализована в модуле в щеголях)Как я могу проверить, получил ли процесс сигнал, когда он находится в очереди ожидания 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); 
} 
.... 
Смежные вопросы