Как да докладвам правилно внезапния край на друг процес в Linux?

Работя върху вградено решение, при което работят две приложения: едното е потребителският интерфейс, а другото работи във фонов режим, предоставяйки данни за потребителския интерфейс.

Наскоро се натъкнах на изтичане на памет или подобна грешка, която кара Linux да убива вторичния процес, оставяйки потребителския интерфейс в спряна ситуация, без да казва нищо на потребителя какво се случва. Достигнах до проблема, като прочетох лог файла message на Linux и разпечатката на софтуера на терминала „Kill -myapp“.

Въпросът ми е: как бих могъл да забележа такова събитие (и други подобни), идващо от вторичния софтуер, за да мога правилно да го докладвам на потребителя и да го регистрирам? Искам да кажа, че е лесно да преглеждате от време на време в „дървото“ на процеса, за да видите дали вторичното приложение работи и, ако не е, да докладвате за „случило се е някакво събитие“ в потребителския интерфейс и също така е възможно да има грешка -handler система във вторичното приложение, която го кара да записва в регистрационен файл какво току-що се е случило и кара потребителския интерфейс да чете този файл за нови записи от време на време, но как би могло приложението за потребителски интерфейс да знае с по-добри подробности какво се случва в такива повече резки събития? (в този случай „Linux уби процеса“, но може да е „сегментиращ канал“ или друг) (и ако има друго, по-добро решение, че това „постоянно чете лог файл, създаден от второстепенното приложение“, аз също бих искал да знам)

Забележки: потребителският интерфейс е написан на C++/Qt, а вторичното приложение е на C. Въпреки че решение, използващо библиотеката на Qt, би било добре дошло, мисля, че би било по-добре за цялата програмистка общност, ако се даде по-обобщено решение.


person Momergil    schedule 14.08.2014    source източник
comment
Прочетете: alexonlinux.com/signal-handling-in-linux Проверка от потребителският интерфейс също може да е интелигентен, защото манипулаторът на сигнали може да не стартира във всички случаи, когато процесът е убит.   -  person eerorika    schedule 14.08.2014


Отговори (1)


Можете да създадете манипулатор на сигнали за POSIX сигнали като SIGKILL в задния процес и да уведомите потребителския интерфейс, използвайки например друг сигнал с sigqueue. Всеки IPC механизъм трябва да работи, стига да е асинхронен. Прочетете повече за сигналите: урок и ръководство

Все още може да е добра идея периодично да проверявате от страна на потребителския интерфейс, защото манипулаторът може да не успее.

Що се отнася до по-добър начин да проверите дали процесът е активен в сравнение с четенето на лог файла: Проверете дали процесът съществува предвид неговия pid

person eerorika    schedule 14.08.2014
comment
(никога не сте мислили да промените потребителското си име? :P) благодаря за отговора! Въпрос: в кои случаи манипулаторът може да не стартира? В2: Знам как да пиша манипулатори на сигнали от приложението, където може да възникне грешката, но как би било да пиша в процес, различен от този, в който възниква грешката? Или всъщност искате да напишете манипулатора по първия начин? - person Momergil; 14.08.2014
comment
Мисля, че името ми е запомнящо се :) Въпрос: Е, може би бях прекалено предпазлив с този съвет. Може би някакъв проблем в самата ОС. Най-вече мислех да покрия потребителския интерфейс, в случай че вашият манипулатор не успее да направи това, което трябва (например поради грешка). - person eerorika; 14.08.2014
comment
Q2: Да, първият начин. Изпратете сигнал (sigqueue) към процеса на потребителския интерфейс от манипулатора на сигнали в крайния бекенд. Или използвайте друг IPC механизъм - person eerorika; 14.08.2014