2009-07-06 2 views
3

У нас есть небольшое приложение для демона, написанное на C для нескольких различных платформ UNIX (эта проблема происходит в SunOS 5.10), которая в основном просто открывает последовательный порт, а затем прослушивает информацию, поступающую через сказал порт.Приложение, получающее таинственные SIGINTs

В данном конкретном случае демон, кажется, считывает одну передачу (например, данные о файле), отправленную через последовательный порт, затем получает SIGINT. Это происходит каждый раз. Другие клиенты используют эту настройку очень точно, не получая SIGINT. Совершенно очевидно, что пользователи НЕ нажимают Ctrl-C. У нас есть относительно простой обработчик сигналов, поэтому мы точно знаем, что это то, что происходит.

Что еще может быть причиной этого? Гуглинг и рассмотрение вопросов здесь, я не мог найти много объяснений по поводу других вещей, которые могут вызвать SIGINT. Я также просмотрел код и не нашел вызовов для рейза() и только один вызов для kill (pid, 0), который в любом случае не отправил SIGINT.

Любые мысли или прозрения определенно будут оценены.

+0

Отладка не содержит никаких намеков? Что говорит вам gdb? –

+0

Не отлаживали это место на месте, так как это нетривиальное мероприятие. – Morinar

ответ

2

Если вы не хотите, чтобы последовательный порт стал управляющим терминалом для процесса, откройте его, используя флаг openO_NOCTTY. Если это управляющий терминал, данные из последовательного порта могут интерпретироваться как прерывание или другой специальный символ.

+1

Я собираюсь принять это, поскольку это был самый полезный отзыв, представленный в любом из трех ответов, но правда была немного Более того, чтобы отметить завершение передачи на последовательном порту, был отправлен ETX (ascii char 3). Оказывается, этот символ также удваивается как символ SIGINT. Машина Solaris рассматривала персонажа, оценивая это как сигнал, а затем передать сигнал процессу. Решение было так же просто, как добавить ISIG c_lflag и установить его с помощью ioctl(). Я также установил O_NOCTTY, так как все равно должно было быть так. – Morinar

+0

BTW: ЯВЛЯЕТСЯ Флаг IG в основном просто отключает процесс сигнала на последовательном порту ... в основном, обязательно, если вы читаете в режиме RAW, как я. – Morinar

+0

Хорошая ссылка для тех, кто имеет аналогичную проблему в будущем: http://www.easysw.com/~mike/serial/serial.html – Morinar

0

Я нашел интересный blog post об отладке проблемы с похожими симптомами. Хотя я сомневаюсь, что это та же проблема, у нее есть очень полезные советы по отладке для отслеживания происхождения сигналов.

+0

Это выглядит довольно интересно и на самом деле похоже на то, что я испытываю. Я внес изменения, которые были рекомендованы в блоге, и я сейчас в процессе тестирования. – Morinar

1

Вы не сказали, как прикреплен ваш обработчик сигнала, но если вы можете прикрепить его с помощью sigaction(2) таким образом, чтобы получить siginfo_t то похоже, что будет включать в себя идентификатор процесса, который послал сигнал (si_pid).

+0

К сожалению, эта ссылка была man man. Копия файла SunOS 5.10 находится по адресу http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?sigaction+2 (в нем не перечислены члены siginfo_t, но, надеюсь, si_pid все еще присутствует) , –

+0

Он прикреплен с сигналом(), который я не читал, «неважен». Если я не сделаю никакого прогресса, я попробую переключить его на sigaction(). – Morinar

+0

Огонь, предыдущий комментарий должен быть прочитан: «Я читал« непригоден ». Независимо от того, смотря на страницу руководства, это не похоже на то, что si_pid настроен для SIGINT. Для всех сигналов установлены только первые три поля , остальные - союз, который, кажется, установлен только в особых обстоятельствах. Хорошо подумал. – Morinar

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