|  | | Страници по тази тема: 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 | (покажи всички) |   | 
 |