Skip to main content

sample program to demonstrate writing daemon program in C and linux

/*
 * program to demonstrate writing daemon programs in C and linux
 * This Daemon print(adds) time or date every minute, depending on
 * user choice t or d to syslog file
 */

#include <stdio.h>
#include <sys/stat.h>
#include <syslog.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
/*
 * parameters to daemon using argc and argv
 */
int main(int c, char *argv[])
{
 pid_t pid, sid;
 char ch;
 time_t t;
 char  buf[80];
 struct tm *ts;

/*
 * this daemon expects one argument
 * as daemon name is count number 1 and one arg to daemon
 * so checking for count <2
 */

 if(c<2) {
    printf("usage: <program name> d | t \n");
    return 0;
 }

 ch = argv[1][0];
 printf("The choice is %c\n", ch);

 if (!((ch =='d') || (ch == 't'))) {
     printf("Not right choice ..\n");
     return 0;
 }

 /* step 1 of daemon writing */
  pid= fork();
  if(pid < 0) {
     exit(0);
  }

 if(pid > 0){
    printf("The PID of daemon is %d\n", pid);
    exit(0);
 }
 
/* changing file mode creation mask, step2 of daemon creation*/
 umask(0);

/* step3 create new session and child becomes part of this new session*/
 sid=setsid();

if(sid<0) {
  exit(1);
}

 
/* step 4 change the current directory to root (/) */
if(chdir("/")<0) {
   exit(1);
}

/* step 5 close all standard input, output and error files */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

/*
 *  after above step we can do any daemon specific
 * initialization if needed
 */

/* last step create infinite loop and add job required to done by daemon */
while(1){

    t=time(0);
    ts= localtime(&t);

   /* This daemon just prints below message every 60 secs
    * you can run this with choice 'd' or 't' to get below messages
    * else nothing will be logged to syslog messages
    * to see message logged to can cat /var/log/syslog
    * if you configured else nothing will be presented
    */
   if(ch=='d') {
     strftime(buf, sizeof(buf),  "%a %Y-%m-%d %H:%M:%S %Z", ts);
     syslog(LOG_INFO, "Daemon %d: prints %s every minute %s..", getpid(), "date", buf);
     sleep(60);
   } else if(ch == 't'){
     strftime(buf, sizeof(buf),  "%H:%M:%S %Z", ts);
     syslog(LOG_INFO, "Daemon %d: prints %s every minute %s..", getpid(), "time", buf );
     sleep(60);

  }

}

}

/* end of the program */

output of the program
- ---- ---- ---- ---- ---

with option d
== === ===
Aug 28 13:59:06 ubuntu a.out:Daemon 16635: prints date every minute Sun 2011-08-28 13:59:06 PDT..

with option t
== == ===
Aug 28 13:59:45 ubuntu a.out: Daemon 16645: prints time every minute 13:59:45 PDT..

Comments

Popular posts from this blog

C Program to Simulate Linux Cat command

/*  * C program to Simulate Implementation of  Linux *cat* command  * This program will not handle redirection  * you can try to improve this program to handle redirection of file contents  */ #include<stdio.h> #include<string.h> #define MAX_FILE_NAME_CHARS 255 int main(int argc, char *argv[]) {  FILE *fp;  char file_name[MAX_FILE_NAME_CHARS], ch;  int i;  /*   * after creating a.out, rename it as mycat for our own cat command   * and it usage is same as standard cat command   */  if(argc<1){     printf("Usage mycat <filename> \n");     return 0;  }  /*   * cat handles more than one file   * so we need this loop to handle all the files provided   * on command line   */  for(i=1; i<=argc;i++){     /* no need of copy but for understanding purpose, i have created      * str...

simple program to create Orphan process

shiv@ubuntu:~/ds/unix$ cat  orp.c /*  * Program to create orphan process @ Linux  * getpid() gives process PID and   * getppid() gives process's parent ID   * here main() process ID is parent id is current shells PID  * once process becomes orphan it is adopted by init process(it's PID is 1)  */   #include<stdio.h> #include<unistd.h> int main() {  pid_t p; /* create child process */  p=fork();  if(p==0) {     /* fork() returns Zero to child */     sleep(10);  }  printf("The child process pid is %d parent pid %d\n", getpid(), getppid()); /*parent/child waits for 20 secs and exits*/  sleep(20);  printf("\nProcess %d is done its Parent pid %d...\n", getpid(), getppid());  return 0; } O/p shiv@ubuntu:~/ds/unix$ ./a.out The child process pid is 2575 parent pid 1922 The child process pid is 2576 parent pid 2575 Process 2575 is done it...

Simple program to illustrate variadic macros In C

/*  * C99 has  support of variable arguments in macros statement  * (called variadic macro) just like variable argument function, Macros also   * can be of variable number of augments  * This program illustrate variadic macros  */ #include <stdio.h>   /*   * Simple Macro definition   * which allows to print whatever the way you want   *  in Macro definition "..." indicates variadic macro, OP() definition is    * mixture of named args and variable number of aguments, it is possible   * to have macro of complete variable number of args   * like DISPLAY in below example   */ #define OP(format, exp, ...)  printf(format, exp, ##__VA_ARGS__) #define DISPLAY(...)    printf(__VA_ARGS__) int main() {  int a=3, b=4, c=5;  OP("%s %d\n", "Result after add", a+b);  OP("%s %d %s %d\n", "Result after add", a+b+c, "Result after sub", a-b);  OP("%s\n", "This is tes...