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      * string for each file name      */     strncpy(file_name, argv[i], MAX_FILE_NAME_CHARS);     fp=fopen(file_name, "r");     if(fp == NULL) {   

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 its Parent pid 1922... shiv@ubuntu:~/ds/unix$ Process 2576 is done its Parent pid 1...

Interactive C program to implement stack using doubly linked list

shiv@ubuntu:~/ds/stack$ cat stack.c /*  * Copy right by Shiv Yaragatti  * you are free to use, modify  and redistribute code on own risk  * Interactive C Program to implement STACK using Doubly linked list  */ #include "header.h" struct stack { int data; struct stack *next; struct stack *prev; }; typedef struct stack *S; /*Push elements in to stack */ void push(S *stack) {   int e;   S temp;   temp=malloc(sizeof(struct stack));   if(!temp){      printf("Can't allocate memory\n");      return;  }  printf("Enter element to push\n");  scanf("%d", &e);  temp->data=e;  if(*stack == NULL){     temp->next = temp->prev = NULL;     *stack=temp;  } else {    temp->next = *stack;    (*stack)->prev = temp;    temp->prev = NULL;    *stack=temp;  } } /* Display elements in the stack */ void display(S s){    S temp;    temp=s;    printf("Elements are ...\n");    while(temp) {     printf("%d\n", temp->data