![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
Добрый день Есть задание нужно по определенной схеме передать сигналы от процесса предка процессу потомку и из потомка предку.
Вот код в котором потомок получает сигналы, обрабатывает их как надо, НО при передаче сигналов потомку выводится сообщение "Обрыв терминальной линии":
По сигналу SIGHUP потомок вычислеяет следующее число в ряде Фибоначчи, а при передаче сигнала предку должен выводить сообщение, но не выводит. Хотя сигнал отправляется. Что выводит: ![]() В чем может быть проблема? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
qw1mb0, для подобных вещей есть сокеты (не обязательно сетевые), пайпы, ipc...
|
|||
|
||||
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
bsa, Я понимаю, что есть сокеты
![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Орригинальное использование функции sigaction
![]() Почитайте повнимательнее, что именно она делает |
|||
|
||||
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
xvr, Изменение действия процесса при получении определенного сигнала, так ведь?
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
Ну изменил код так, избавился от циклов:
Вот, что получается ![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Этого недостаточно. Перенесите вызов sigaction в начало функции parent в родителе (после строки 42). У вас сейчас обработчик сигналов в родителе устанавливается в самом конце, и когда child посылает сигнал родителю, то обработчик не вызывается, т.к. он еще не установлен. Вместо этого родитель прибивается с сообщением 'обрыв терминальной линии' |
|||
|
||||
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
xvr, А разве из моего скриншота не видно, что предок не обрабатывает сигналы посланные родителем? Он должен на каждом сигнале выводить следующее число фибоначчи, а он выводит только 1 раз. Далее не обрабатывая сигнал.
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
В смысле 'потомок не обрабатывает'? Он и не будет, т.к. родитель никаких сигналов не посылает, т.к. его к этому моменту уже убил этот самый потомок (неперехваченным сигналом) У вас процесс выглядит так:
|
|||
|
||||
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
xvr, В таком случае вот этот код должен:
1. parent в цикле посылает всего 8 сигналов SIGHUP 2. В процессе child мы устанавливаем обработчик сигналов sigaction(SIGHUP, &sa, 0 ); в строке 48 с соответствующей реакцией на сигнал SIGHUP определенной в функции term_handler (вывод следющего числа фибоначчи). Судя по вашим словам эта 48 строка должна обработать все 8 сигналов от parent и вывести 8 чисел фибоначчи. 3. Далее parent шлет сигнал SIGTERM и child должен вывести сообщение и завершить программу так как в обработчике задано exit(0); - 19 строка
Но вот, что выводит у меня программа: ![]() Видно, что child не обрабатывает сигналы от parent, хотя обработчик установлен. Хм... Он не обрабатывает, потому что child успевает завершить работу. Понял свою ошибку. Но почему при добавлении sleep(50); в 51 строку, он все равно обрабатывает только 1 сигнал SIGHUP от parent ? Это сообщение отредактировал(а) qw1mb0 - 1.4.2012, 21:02 |
|||
|
||||
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
xvr,
Спасибо большое за обсуждение и критику. Помогла пойти в правильную сторону и код заработал, вот он какой получился:
А вывод тот, который я хотел выглядит так: ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |