IPC преминаване за потребителско пространство на Linux exe

Имаме програма, нека я наречем Y.exe. Работи на вградена система и работи без излизане (т.е. системата стартира, зарежда ядрото на Linux, всички модули на ядрото, след това Y.exe и Y никога не се връща (потребителско пространство)).

Сега идва момент, в който от нас се изисква да променим начина, по който работи Y.exe, т.е.

Настоящият начин за това е да се компилира и прекомпилира Y, за да се справи с всеки тест. Това изглежда като загуба на време и трябва да можем динамично да задаваме условията.

Бих искал да използвам нещо като системата proc/debug от ядрото, където можете просто да направите нещо като:

echo 1 > /proc/test_y

за активиране на тестове и др.

Тъй като proc/debug са елементи на ниво ядро, те не могат да се използват за изпълними файлове в потребителското пространство (?).

Освен прилагането на пълен IPC чрез съобщения Q или TCP, има ли други начини за прилагане на подобна функционалност?

Благодаря.


person user626201    schedule 09.03.2011    source източник


Отговори (1)


Трябва ли да проверява за съществуването на файл с флаг някъде през всяка итерация на цикъл на събитие?

Задаване на манипулатор на сигнали за SIGUSR1? SIGUSR2?

При възникване на някое от тези, задайте стойност на флаг в програмата, която ще извърши тестовете или ще изведе информацията за отстраняване на грешки, и след това се превключва след получаване на друг, или файлът с флаг изчезва и т.н.

Нещо като горното трябва да постигне подобна функционалност на това, за което говорите. Сигналите биха били по-незабавни (и вероятно по-ясни), но и двата механизма трябва да са достатъчни.

person Sdaz MacSkibbons    schedule 09.03.2011
comment
Можете ли изобщо да изпращате тези сигнали чрез командния ред? Идеята е да има флагове и т.н., които могат да контролират функционалността, като използват опциите за вероятно/малко вероятно gcc, за да направят по-малко въздействие върху времето за изпълнение. - person user626201; 09.03.2011
comment
Да, kill -USR1 PID ще го направи. kill -l изброява възможните налични сигнали. SIGKILL и SIGSTOP не могат да бъдат прихванати. man 7 signal дава повече информация за различните сигнали и тяхното поведение по подразбиране. Вероятно ще искате да използвате функциите signal (и вероятно sigaction), за да работите с тях, ако все още не сте запознати с тях. - person Sdaz MacSkibbons; 09.03.2011
comment
Обърнете внимание, че има само 2 сигнала на потребителско ниво (въпреки че някои хора също закачат SIGHUP и други), така че ако искате повече от това, можете също да обмислите използването на наименуван канал за предаване на конкретни команди за това каква информация за отстраняване на грешки да активирате (и с нещо подобно естествено идва с повече сложност.) - person Sdaz MacSkibbons; 09.03.2011
comment
А, да, забравих другата част. имаме нужда от доста индикации, за да контролираме всички модули...така че може би сигналите не са толкова добра идея. Предполагам, че няма начини за предаване на аргументи към сигналите? - person user626201; 09.03.2011
comment
Не по този начин. За да прехвърлите информация отвъд това, наименуван канал, в който можете просто да пишете прости команди, който изпълняваният процес се отваря и наблюдава другия край при стартиране и при всяка итерация на цикъл на събитие вероятно ще бъде най-добрият. Можете да го направите и с флагов файл, но наименуван канал автоматично ви дава чист FIFO (въпреки че вероятно все още искате да flock записващата страна), докато флаговият файл трябва да бъде по-внимателно контролиран за условия на състезание. - person Sdaz MacSkibbons; 09.03.2011
comment
ААА добре. Наистина не съм запознат с тръбите. Но ще говорим ли за | на командния ред? или трябва да внедрите отделна програма за изпращане на информацията? - person user626201; 09.03.2011
comment
Не, когато извикате mkfifo, той просто създава възел във файловата система на посоченото място; след това можете да го отворите за четене (в сървърния процес) и да го потърсите/изберете през всеки цикъл на събитие (вероятно с O_NONBLOCK) и да го прочетете, ако данните станат налични. Тъй като искате да заредите определени модули, просто бих измислил някои прости команди за предаване като LOAD modname и UNLOAD modname или нещо подобно. От другия край можете просто да echo LOAD module > pipefname към него като нормален файл. - person Sdaz MacSkibbons; 09.03.2011
comment
Можете да обвиете всичко това в #ifdef изрази или каквото и да е за условна компилация, за да се отървете от логиката в производството. Сигналите биха били по-непосредствени, но това ще работи добре. Вашият първоначален въпрос спомена само флаг, а не сложно средство за зареждане/разтоварване на модули, поради което избрах оригиналното решение, между другото. ;-) - person Sdaz MacSkibbons; 09.03.2011
comment
P.S. mkfifo е едновременно инструмент за cmdline и извикване на библиотека. - person Sdaz MacSkibbons; 09.03.2011
comment
Благодаря. За съжаление оригиналният пример е малко опростен. Тръбата изглежда като добро решение. Сигналът е страхотно малко знание, което трябва да запомните :) - person user626201; 09.03.2011
comment
Наздраве, колега. HTH. (Трябваше да отида до магазина, оттам и 30-минутното закъснение ;) Pipe очевидно ще бъде по-ангажиран, но тъй като имате нужда от допълнителна функционалност, изглежда най-доброто решение. - person Sdaz MacSkibbons; 09.03.2011