Mulla on C-kielellä kirjoitettu Linux ohjelma jossa on kaksi dameonia. Haluan että toinen daemon tappaa toisen kun tietyt ehdot täyttyvät.
Mitä erilaisia keinoja tähän on?
Mitä erilaisia keinoja tähän on?
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 10
Vanhimmat
SIGTERM tapettavalle prosessille ja teet sille rutiinin mikä siivoaa ja lopettaa prosessin asiallisesti.
http://unixhelp.ed.ac.uk/CGI/man-cgi?signal 7
Ekax pitäisi osata tehdä se SIGTERM tapettavalle prosessille (:
Kuten huomaatte, en hallitse Linuxia. Joku esimerkki voisi auttaa.... täytyy googlata.
Eikö se onnistu niin että pääohjelma joka on käynnistänyt kyseisen daemonin, saisi sen prosessi-ID:n jotenkin selville (miten?) ja sitten kill(pid);
Oman pidin saa kyllä selville
pid_t my_pid = getpid();
mutta miten naapurin?
fork():issa haarautumisen jälkeen pid on selvillä, mutta toisessa haarassa (jossa sitä tarvitaan) se on nolla.
PID:in voi tallentaa tiedostoon esimerkiksi /var/run hakemistoon. Tosin ei taida sopia tarkoitukseesi. Mitä yrität saada aikaiseksi? Olisiko ongelmaan parempaa ratkaisua kuin kill toisesta prosessista...?
"PID:in voi tallentaa tiedostoon esimerkiksi /var/run hakemistoon."
Googlailin vähän ja huomasin että noin oli tehty. Äsken huomasin että jos oletan että kummallakin dameonilla on peräkkäiset ID:t, niin saan tapettua toisen daemonin toisen kautta. Voidaanko olettaa, että jos X on luonut Y:n, niin X:lla ja Y:llä on aina peräkkäiset ID:t?
"Mitä yrität saada aikaiseksi? Olisiko ongelmaan parempaa ratkaisua kuin kill toisesta prosessista...?"
En tiedä onko parempaa ratkaisua. Se mitä olen tekemässä, on tässä vaiheessa pelkkä opiskelu, mutta tämä opiskelu tähtää yhteen testeriin jossa yhdessä daemonissa on käyttöliittymä ihmiselle ja toisessa daemonissa tutkitaan kortinlukijaa. Jossain vaiheessa näiden dameonien välille tarvitaan myös putket tiedon vaihtoon. Onko hyvä idea tässä vaiheessa unohtaa tuo kill(pid) ja välittää tappokäsky putken kautta? Hmm... sekin olisi kill() ?
Nyt kun sammutan käyttöliittymän ihmiselle, niin joudun aina erikseen sammuttamaan tuon toisenkin daemonin.
Daemon käyttöliittymänä ajatus ontuu hieman... :) Demonin tarkoitus yleensä on olla aina käynnissä taustalla.
Tee erilliset ohjelmat korttia lukevalle daemonille (palvelin) ja käyttöliittymäosalle (asiakasohjelma, normaali ohjelma). Daemon on taustalla pyörivä ohjelma ilman standardipäätettä (tty), eli tekstikäyttöliittymää. Palvelinhan on rajapinta jollekin asialle, esim. äänikortin jakaminen usealle sovellukselle. Asiakas-palvelin kommunikointi hoituu esim. Unix-sockettien kautta.
Mieti vielä, onko todella tarvetta erilliselle palvelulle. Tuleeko yksinkertaisempi ratkaisu, jos vain suoritat kortin lukemisen rutiinina käyttöliittymäohjelmassa.
http://www.enderunix.org/docs/eng/daemon.php
http://www.lowtek.com/sockets/
http://www.cs.utah.edu/~swalton/listings/sockets/programs/
"Daemon käyttöliittymänä ajatus ontuu hieman... :) Demonin tarkoitus yleensä on olla aina käynnissä taustalla. "
Tämä ohjelma tulee olemaan sellainen joka pyörii taustalla ilman päätettä - vieläpä sulautetussa laitteessa. Ainoa liityntä ihmiseen on sirukortinlukija, muutama painonappi ja LCD-näyttö.
Haluan saman sovellusohjelman toimimaan myös PC:ssä. Tässä LCD-näyttö ja painonapit on korvattu GTK:lla tehdyllä käyttöliittymällä. (Tämä on myös main() joka käynnistää daemonit.) PC-versio on tarkoitus tehdä helpottamaan ohjelman testausta ja edelleen keittämistä. Kortinlukija liitetään USB-porttiin sekä sulautetussa että PC:ssä.
Kun sammutan käyttöliittymän, niin haluan että kortinkäsittelijä daemon kuolee samalla. Kortinkäsittelijä on valmis ja toimiva ja jopa käytössä asiakkaiden laitteissa. (Se ei ole minun tekemä.)
Sulautetussa daemonien tappoa ei tarvita. (Taisi siinä olla jonkin skripti jolla koko hoidon sai pysäytettyä, en muista nyt eikä minulla ole mahdollisuutta tarkistaa asiaa juuri nyt.)
Jos tarkkoja ollaan, niin tässä systeemissä on vielä muutakin, mutta se ei ole oleellista tässä. Se muukin on toteutettua daemonina.
"Mieti vielä, onko todella tarvetta erilliselle palvelulle. Tuleeko yksinkertaisempi ratkaisu, jos vain suoritat kortin lukemisen rutiinina käyttöliittymäohjelmassa."
Kortinlukijadaemon tekee muutakin kuin lukee korttia. Se mm tarkistaa sulkulistaa, ohjaa nestekidenäyttöä yms. Ja tuokin on valmiina, joskaan se ei toimi vielä tekemäni GTK-käyttöliittymän kanssa.
Noni, eli se PC:ssä se käyttöliittymä on edelleen erillinen softa eikä daemoni. Itse kortinlukija-daemoni käynnistetään execve() käyttöliittymässä. Sit vaan kill() daemonille, nii lähtee. PID löytyy sieltä /var/run. Forkilla tehdään lapsia, mikä ei ole tässä tarkoituksen mukaista...
Paljonko lisäkonsultaatiosta maksetaan? :)
Konsultaatiota tuli jo enempi kuin odotin. Kiitos! Daemonit siksi kun ennenkin (sulatetussa) oli daemonit, mutta tutkin myös tuota vaihtoehtoa.
Dameonit kortinlukijoille yms ovat mielestäni hyvin kelvollinen ratkaisu tässä tapauksessa. Siitä ei ole enää epäilytäkään.
Myöskään PIDiä tai PIDejä ei tarvitse tallettaa eikä se ole edes ongelma. Emosta saan tapettua helposti kaikki tyttäret. Tarvittavat pidit saan getpid():illä kun vaan teen homman oikein.
Jos PIDin haluaa tallettaa paikkaan /var/run, niin se on muuta tarkoitusta varten.