
Daemon programming in Raspberry Pi Jaakko Koivuniemi CERN/PH April 11, 2014 Abstract command line interface, what is a daemon?, typical daemon structure Raspberry Pi at CERN Jaakko Koivuniemi April 12, 2014 Command line interface and C • used in computers long before graphical user interface • usually enough for servers that do not need friendly user interface • can be efficient over slow network connection • in linux most important operations can always be done from CLI • allows shell scripting and programming • rapid developement of working programs Raspberry Pi at CERN 1 Jaakko Koivuniemi April 12, 2014 C get options 1 #include <s t d i o . h> #include <s t d l i b . h> 3 #include <g e t o p t . h> 5 v o i d printusage() f 7 p r i n t f ("usage: numbers[ −nN][ −h] n n"); g 9 i n t main(int argc, char ∗∗ argv ) 11 f i n t count=0; 13 i n t optch=0; 15 w h i l e(optch!= −1) f 17 optch=getopt(argc ,argv ,"n:h"); i f (optch=='h') Raspberry Pi at CERN 2 Jaakko Koivuniemi April 12, 2014 19 f printusage(); 21 r e t u r n 0; g 23 i f (optch=='n') f 25 count=atoi(optarg); g 27 g 29 i n t i=0; 31 f o r(i=0;i <count ; i ++) f 33 p r i n t f ("%dnn",i); g 35 r e t u r n 0; 37 g Raspberry Pi at CERN 3 Jaakko Koivuniemi April 12, 2014 Compile and test 1 pi@raspberrypi ~ $ gcc −g −O −Wall numbers.c −o numbers pi@raspberrypi ~ $ numbers −n 3 3 0 1 5 2 Raspberry Pi at CERN 4 Jaakko Koivuniemi April 12, 2014 What is a daemon? • general service run in background • examples: atd, crond, httpd, ifplugd, ntpd, sshd, udevd 1 pi@raspberrypi ~ $ service −−s t a t u s−a l l pi@raspberrypi ~ $ service ifplugd help 3 pi@raspberrypi ~ $ service ifplugd status pi@raspberrypi ~ $ sudo service ifplugd stop Raspberry Pi at CERN 5 Jaakko Koivuniemi April 12, 2014 Writing a daemon program • can read a configuration file from /etc/mydaemon conf • writes a log file to /var/log/mydaemon.log, verbose level can be set from configuration file • logrotate(8) can be used to rotate/compress log file • typically /var/lib/mydaemon/ has the live data • /var/run/mydaemon.pid process number • daemon needs to catch signals like SIGHUP, SIGTERM Raspberry Pi at CERN 6 Jaakko Koivuniemi April 12, 2014 • can be started and stopped manually with service mydaemon start/stop • can be started or stopped by the system at different run levels • can be written in C/C++ or as Perl/Python script, the first typically for mature projects and latter for fast developement with modern data structures Raspberry Pi at CERN 7 Jaakko Koivuniemi April 12, 2014 Example: temperature logging • temperature from tmp102 read with I2C bus • data written to a log file /var/log/tmp102d.log v o i d logmessage(const char logfile[200], const char message[200], int l o g l e v , int msglev) fg 2 i n t read d a t a (int address, int length) f r e t u r n0 g 4 v o i d read temp ( ) fg 6 i n t cont=1;/ ∗ main loop flag ∗/ 8 v o i d stop(int sig) 10 f Raspberry Pi at CERN 8 Jaakko Koivuniemi April 12, 2014 sprintf(message ,"signal%d catched, stop",sig); 12 logmessage(logfile ,message,loglev ,4); cont =0; 14 g 16 i n t main() f 18 sprintf(message ,"tmp102dv.%d started",version); logmessage(logfile ,message,loglev ,4); 20 signal (SIGTERM,&stop) ; 22 w h i l e ( cont==1) 24 f read temp ( ) ; 26 s l e e p (60) ; g 28 r e t u r n 0; 30 g Raspberry Pi at CERN 9 Jaakko Koivuniemi April 12, 2014 Daemonization • fork off the parent process and let it terminate • setsid - create a new session • catch signals • chdir - change the working directory of the daemon. • umask - change the file mode mask according to the needs of the daemon • close - close all open file descriptors that may be inherited from the parent process Raspberry Pi at CERN 10 Jaakko Koivuniemi April 12, 2014 Automatic start at boot time • shell script at /etc/init.d/tmp102d 1 pi@raspberrypi ~ $ sudo update−rc.d tmp102d defaults pi@raspberrypi ~ $ sudo service tmp102d start/stop Raspberry Pi at CERN 11 Jaakko Koivuniemi April 12, 2014 References • http://en.wikipedia.org/wiki/Daemon (computing) • http://stackoverflow.com/questions/17954432/creating-a-daemon-in-linux • https://github.com/oh7bf/tmp102 (to be done) Raspberry Pi at CERN 12.
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages13 Page
-
File Size-