I need to write a Linuxland daemon that talks to our custom hardware.  I 
would like to use the /init process to start, and if necessary, restart it. 
 I have made this entry into the init.<hardware>.rc file that looks like 
this:

  service rsgd /system/bin/rsgd
    class main
    user system

Here is my daemon (just a skeleton now, but it runs):

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>

          #define DAEMONIZE
 

int main(void)
{

#ifdef DAEMONIZE 

  pid_t pid, sid;
  
  /* Fork off the parent process */
  pid = fork();
  if (pid < 0) {
    exit(EXIT_FAILURE);
  }
  /* Exit the parent process. */
  if (pid > 0) {
    exit(EXIT_SUCCESS);
  }
#endif

 

  /* Change the file mode mask */
  umask(0);
          
#ifdef DAEMONIZE 

  /* Create a new SID for the child process */
  sid = setsid();
  if (sid < 0) {
    /* Log the failure */
    exit(EXIT_FAILURE);
  }
#endif

 

 
  /* Change the current working directory */
  if ((chdir("/")) < 0) {
    /* Log the failure */
    exit(EXIT_FAILURE);
  }
  
  /* Close out the standard file descriptors */
  close(STDIN_FILENO);
  close(STDOUT_FILENO);
  close(STDERR_FILENO);
  
  /* Daemon-specific initialization goes here */
  
  /* The Big Loop */
  while (1) {
    /* Do some task here ... */

    usleep(100000); /* wait 100 milliseconds */
  }
  exit(EXIT_SUCCESS);
}


Nothing fancy.  When I build the system, the daemon gets created properly, 
and lives in /system/bin, as expected.  When I boot the system, however, 
/init continually starts my daemon, many times, until the system eventually 
runs out of memory!

Is there something my daemon needs to do so /init doesn't think it has died 
and needs to restart? 

Well, as I wrote this originally, I had an "Aha!" moment - /init must be 
acting on the exit of the parent process!  That would explain why it starts 
another instance, even though the prior one is still around.  So I got rid 
of the code with the DAEMONIZE conditionals, but that just hangs the system 
immediately after print this message:

Freeing init memory: 248K


So, what is the proper way to write a Linux daemon that /init can manage 
for me?  Any ideas welcome!

Thanks!

-- 
-- 
unsubscribe: android-porting+unsubscr...@googlegroups.com
website: http://groups.google.com/group/android-porting

--- 
You received this message because you are subscribed to the Google Groups 
"android-porting" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to android-porting+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to