|
Страници по тази тема: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | (покажи всички)
Тема
|
Сигнали под Линукс
|
|
Автор |
Герисъм (корав оптимист) |
Публикувано | 13.10.15 11:46 |
|
Привет! Да ви върна малко към професионални въпроси :)
Може да сте разглеждали вече подобен проблем, аз минавам доста рядко и със сигурност съм го пропуснал. Така че ако има подобна тема, само ме насочете към нея.
Аз пиша основно под Виндовс. Сега ми се наложио спешно да префасонирам и подкарам един гигантски проект под Линукс, Ubuntu. Всичко си е ок, с изключение на следното.
Програмата обработва екстрените ситуации по стандартен начин. Навсякъде където трябва има капанчета от рода на
try {
......
}
catch (exception1&...
catch (exception2&...
catch(...) {...}
Под Виндовс всичко си е перфектно. Под Линукс обаче има и сигнали, които не се ловят от тези капани, например SIGBUS и подобни. Проблемът е как да прекарам и такива сигнали (избран набор, не всички) да се насочат да се ловят от някой catch по-горе, за да може всичко да си мине по реда - да се извикат съответните деструктори на обекти и да се освободят нужните ресурси доколкото може и да се вземе нужното решение какво да се прави. Идеята е това да стане с минимални доработки на горният механизъм, а не цялостната му замяна. Целта е приложението да работи 24/7, като в краен случай да се саморестартира интелигентно. Нужно е това да работи коректно и в многонишков контекст.
В общият случай капаните от горният тип са вложени един в друг, тоест в тялото на try{} някъде навътре има подобна конструкция, ловяща същото или подобно.
Аз не съм на ти със сигналите, затова и питам. Ако някой е правил нещо подобно, ще се радвам ако го сподели. Ако някой има други идеи по въпроса, пак няма да остана безрадостен
Успехи!
За разлика от главата, стомахът се усеща когато е празен...
| |
Тема
|
Re: Сигнали под Линукс
[re: Герисъм]
|
|
Автор |
rabin (чобанин) |
Публикувано | 13.10.15 11:57 |
|
С какви права ти върви приложението? Хардуерията при разработка си иска root, аз поне нямам нерви да ходя на всеки порт поотделно да му админвам достъпа.
Zaphod: - Не се мъчи да разсъждаваш
| |
|
И не правильно думать, что есть чьим-то богом обещанный рай...
| |
|
Гледах ги вече тези примери, и подобни на тях.
Конструкцията която дискутира автора на въпроса в линка е най-близо до ума, макар и да се оказва неправилна и неработеща (а и throw там се вика в неизвестен контекст). Конструкцията която предлага последният отговор (1 по номерацията) работи, но само в ограниченият вариант на примера. В примера throw се вдига в контекста на нивото на try блока, тоест обработката ще активира конструкторите на това ниво и надолу. Но ако в try е извикана функция fun1(), заела ресурси, и тя вика функция fun2() в която се активира сигнала, в тоя пример няма да се викат деструкторите във fun1() и fun2(), а само на нивото на try. За да работи както се предлага, всяка функция трябва да се облече със свое повикване на signal(), setjmp() и try-catch блок, което е прекалено. Самият компилатор прави подобно скрито обличане за нормалните ексцепшъни, ама на ръка да го повтаряш само заради сигналите, не ми дава сърце. Над 16000 функции има в проекта, поне 10000 ще са потенциално засегнати...
Затова търся нещо по-човешко, ако има. Прежалил съм се вече и за решението в примера, макар да се губят ресурси...
За разлика от главата, стомахът се усеща когато е празен...
| |
Тема
|
Re: Сигнали под Линукс
[re: rabin]
|
|
Автор |
Герисъм (корав оптимист) |
Публикувано | 13.10.15 13:21 |
|
Правата в случая нямат значение, нищо насилствено не се прави с хардуер. Основно файлови операции.
За разлика от главата, стомахът се усеща когато е празен...
| |
Тема
|
Re: Сигнали под Линукс
[re: rabin]
|
|
Автор |
jeffty (chupac) |
Публикувано | 13.10.15 14:47 |
|
Мали тоя с помиярите Сизър Милан как не мога да го дишам, а все него повтарят
| |
Тема
|
Re: Сигнали под Линукс
[re: rabin]
|
|
Автор |
gat3way (altered mind) |
Публикувано | 13.10.15 16:09 |
|
Защо сам си го причиняваш това?
EOF
| |
Тема
|
Re: Сигнали под Линукс
[re: Герисъм]
|
|
Автор |
rgr9 (ентусиаст) |
Публикувано | 13.10.15 16:13 |
|
Има версия на сигнал хандлера който ти дава контекста от където е извикан но не съм сигурен че поддържа неща като avx. Работи със sigill за sigbus не знам.
Man 2 sigaction
Но ще трябва да използваш асемблер.
Дава ти контекста /регистрите/ като втори аргумент на хандлера
Ако правилно съм те разбрал четеш файлове в памет с mmap.
Това значи че докато си мапнал файла го отсичаш, което е доста вероятно да е някаква грешка в програмата.Редактирано от rgr9 на 13.10.15 16:57.
| |
Тема
|
Re: Сигнали под Линукс
[re: gat3way]
|
|
Автор |
rabin (чобанин) |
Публикувано | 13.10.15 16:36 |
|
Koe да си причинявам? Като не си с рут права много неща не вървят. Дори някои игри.
Zaphod: - Не се мъчи да разсъждаваш
| |
|
Оу, тва беше много силно мнение, хохохохо.
А към оригиналния въпрос - ексепшъните в ц++ са отделен механизъм от сигналите и разни други като setjump/longjump и SEH в уиндоуса и е рецепта за яко мазаница и главоболия да се мешат. По-скоро може би е добра идея разни специфични платформени неща да се изолират в кода като отделни модули и евентуално доколкото може някъв общ интерфейс за обвивка, за да се изолира платформено-специфичния код. Ключовото е ИЗОЛИРА, има бая заблудени идеалисти дето се хвърлят да го елиминират, което е загубена кауза.
I have sold less books on sex than Stephen Hawking has on physics -- Madonna
| |
|
Страници по тази тема: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | (покажи всички)
|
|
|