Witam!
Piszę sobie prostego daemona w C dla Linuxa. Chciałabym wykonać jakąś interakcję z działającym daemonem np. spowodować zmianę wartości zmiennej. Jak to najlepiej wykonać (chciałabym aby było to ładne rozwiązanie)? Czytałam o Berkeley sockets (ale wydaje mi się to przerost formy nad treścią) oraz zwykłym pliku, który byłby interfejsem do komunikowania się z daemonem (np. daemon przy każdym wywołaniu sprawdza plik) - podobnie jak pliki w /proc/* , /sys/* przy jądrze Linux. Tylko hmm... nie mam zielonego pojęcia gdzie w Linuxie procesy mogą umieszczać takie pliki do komunikacji aby było ładnie i zgodnie ze sztuką. Ma ktoś jakieś przemyślenia w tej materii?
Pozdrawiam
Miałam odpisać wcześniej, ale chciałam jeszcze doczytać na temat jakiś alternatyw tj. socketów oraz sygnałów. Są gdzieś jakieś przykłady wykorzystania tego dbus w C (nie mogę nigdzie znaleźć)?
Sygnały mi się podobają (bo są dość proste ;p) i wpływam wtedy na daemona np. "kill -USR1 $pid_daemona", ale przeczytałam, że nie powinno się tego do tego stosować ;/ Więc zostaje ten DBus i te sockety - tylko czy użycie ich lokalnie na tej samej maszynie nie będzie błędem w sztuce? Taki daemon-serwer i jakiś prosty klient do zarządzania nim?
Do vpiotr i Rev; myślałam, że zostanę poważnie potraktowana na takim forum. Skończyłam LO i dostałam się na studia. Dziewczyny nie mają prawa się tym zajmować? potrenować w wakacje przed wieczornym wyjściem z koleżankami do Arkadii po nowe Vansy? No właśnie, dziwie się takiemu stereotypowemu zachowaniu.
@karolinaa no offence, są tutaj też kobiety i chyba nie czują się dyskryminowane :) Po prostu często jest tu wysyp pseudo-kobiet (facetów z żeńskimi nickami), którzy liczą na to, że jak będą udawać kobietę i od razu 100 napalonych, samotnych koderów rzuci się im do pomocy ;]
Jeśli chodzi o twój problem:
- sygnały jak najbardziej są ok
- możesz też napisać program "klienta" który za pomocą socketów / sygnałów / pamięci współdzielonej będzie załatwiaj tą komunikację.
Poczytaj książkę pana Stevensa "Advanced Programming in the UNIX Environment", masz tam opisane chyba wszystkie dostępne mechanizmy komunikacji międzyprocesowej w unixach :)
Książek jeszcze nie czytałam, ale zamierzam. Chyba zdecyduje się na sockety tzw. "Unix domain socket" - dość fajnie to działa, można się pobawić i ma duże możliwości. Stworzyłam nawet taki lokalny socket w /var/run/moj_socket ,aplikacja odpalona była z roota. Tylko co chcąc skorzystać z socketu przez klienta odpalonego z zwykłego użytkownika nie wychodziło (uprawnienia). Jak mogłabym wpływać na daemona odpalanego z roota, z poziomu klienta odpalanego z zwykłego użytkownika? Tak by każdy zwykły użytkownik mógł sterować jedną z funkcjonalności daemona? Jest to w ogóle wykonalne nie naciągając zasad UNIXa (przynajmniej używając socketów)?
PS fasadin, Rev: Nie wiem skąd wy to wszystko wiecie o.0. ?! xd Znaczy się wiem, ale jak potrafiliście do tego dojść.
Ale jaki masz problem? Daemon tworzy socket, a klient, ktory chce nim sterowac sie z nim lacza i nastepuje zwykla wymiana danych O.o
Jak Ci tworzy socket z innymi prawami dostepu niz sobie zyczysz to masz chmod()
do zmiany uprawnien.
Nie widze w tym nic skomplikowanego.
karolinaa napisał(a):
Stworzyłam nawet taki lokalny socket w /var/run/moj_socket ,aplikacja odpalona była z roota.
Nie uruchamiaj aplikacji z roota, jest to z wielu względów nie zalecane, a poza tym nie ma uzasadnienia by to robić :)
karolinaa napisał(a):
Jak mogłabym wpływać na daemona odpalanego z roota, z poziomu klienta odpalanego z zwykłego użytkownika? Tak by każdy zwykły użytkownik mógł sterować jedną z funkcjonalności daemona?
Stwórz grupę, dodaj do niej użytkowników, aby wszyscy mogli mieć dostęp do pliku.
start-stop-daemon pozwala na uruchomienie aplikacji z poziomu dowolnego usera (przełącznik --chuid). Tzn uruchamiając skrypt z roota, daemon uruchamiany jest z prawami innego użytkownika np.
Właśnie mój daemon bawi się różnymi plikami do których tylko root ma dostęp. Chciałam jeszcze zrobić jakiegoś klienta dla zwykłych użytkowników. Sockety są dość fajne, ale czytam dalej o mechanizmach IPC. W internecie używając tego hasła można znaleźć ciekawe porównania. http://stackoverflow.com/questions/404604/comparing-unix-linux-ipc