2014-10-22 2 views
0

Я пытаюсь реализовать простой сервер/клиент с обработчиком сигналов.sigset_t полезен в этом случае?

Моя единственная польза для сигналов будет sigaction (SIG ... & сиг, NULL), где:

sig.sa_sigaction = &closeSig; 
sig.sa_flags = SA_SIGINFO; 


void closeSig{ 
    send(ds_sock,"close",1024,0); 
    close(ds_sock); 
    exit(1); 
} 

Если сервер (или клиент) получает "закрыть", он просто закрывает подключение.

В этой ситуации полезно использовать sigset_t и добавить в него все сигналы, которые я хочу обработать, а затем использовать sigaction как up, вместо этого используя только e sigaction?

Если это полезно, вы можете объяснить мне причину? У меня бета-программа, и на сервере она используется sigset, но она не на клиенте. Спасибо!

Редактировать: Я только что узнал, что сервер также использует sigprocmask с разблокировкой. Если я не хочу использовать его, и я хочу, чтобы все сигналы были разблокированы и что они немедленно запускают свой обработчик, мне не нужно использовать sigset, не так ли? Благодаря!

Извините, но я не могу опубликовать код. Если вы можете мне помочь, это хорошо, если вы не можете, спасибо в любом случае!

+0

Ваш вызов send() не имеет смысла; он отправляет 1024 байта из 5-байтового массива. Надеюсь, что это всего лишь пример. – Myria

+0

@Myria Да, это всего лишь пример, это 6 утра, и я все еще изучаю :( Редактировать: во всяком случае я не думаю, что это совершенно неправильно, я имею в виду, я посылаю больше байт, чем необходимо, но это не должно нарушать любая вещь, правильно? – testermaster

+1

Считывание конца массива имеет неопределенные эффекты. Это может ничего не делать, это может привести к дампу ядра, или он может сделать что-то еще. –

ответ

0

кода, показанный на closeSig() не является действительным С. Чтобы быть пригоден для работы с sigaction() и SA_SIGINFO флагом, тип функции должен быть:

void closeSig(int signum, siginfo_t *info, void *context) { … } 

Третий аргументом является void *, но может быть литой до ucontext_t * (см. sigaction()).

Когда вы вызываете sigaction(), вы должны убедиться, что значение sig.sa_mask установлено на известное значение, возможно, используя sigemptyset(&sig.sa_mask);, чтобы очистить все биты. Это означает, что при вызове обработчика сигналов другие сигналы могут прерывать обработчик сигналов. Если вы предпочитаете не допускать этого, используйте вместо этого sigfillset(&sig.sa_mask);; это блокирует все сигналы (которые блокируются), пока действует обработчик сигналов. Неблокируемые сигналы, такие как SIGKILL, будут доставляться.


В комментариях были обнаружены некоторые другие проблемы с показанными фрагментами кода.

Смежные вопросы