Quality improvements to the documentation would be welcome; please see http://source.android.com/source/submit-patches.html
On Friday, June 6, 2014 6:38:41 PM UTC-7, trevd wrote: > > Hi Bob > > Ay there's definitely plenty of room for error. For reference the init > "language" is "documented" here > https://android.googlesource.com/platform/system/core/+/master/init/readme.txt. > > However it's a mixture of fact and fiction as some of the functionality was > never implemented. the "on device-" triggers only ever existed in the mind > of author ( although I believe intel eventually implemented it 4 years down > the line :\ ). It was this functionality which the hotplug service was > developed to implement. > > I can only apologise for "contrived" nature of my code. I was just picking > up C and Linux at the time after spending a decade on .Net, so I can > definitely say it's not the finest piece of code I've ever hacked together > but it did the job. :) > > trevd > > > On Friday, 6 June 2014 18:29:24 UTC+1, rsg wrote: > >> Hi trevd, >> >> Yeah, you are right. What I discovered is that I had a faulty Android.mk >> file that was driving the build of my daemon, such that it sometimes >> worked, but usually didn't. So many of my changes weren't actually taking >> effect! Then, the hang, which was simply a mistake on my part when >> creating the bootable SD Card (don't ask, too embarrassing!), really had me >> confused. >> >> I sorted those issues out last night, and my code (with DAEMONIZE not >> defined) works correctly. >> >> Thanks for confirming my understanding, and for the example daemon - >> seems the right balance between contrived (for ease in understanding) and >> the usual "real-world" (too complicated to understand); it's likely to >> serve as a useful reference going forward! >> >> Regards, >> Bob >> >> >> On Friday, June 6, 2014 11:16:03 AM UTC-4, trevd wrote: >>> >>> Hi there >>> >>> I don't think you need to "daemonize" the process manually as the native >>> service infrastructure handles that for you. IIRC you can sit in the loop >>> on the Main thread. >>> Here's an example of a USB Device hotplug listener I wrote a while back >>> which ran as a system service. >>> >>> https://github.com/trevd/android_external_hotplugd/blob/ics/hotplug.c >>> >>> However if you actually do want to daemonize the process you can add >>> oneshot to the service declaration which will tell init to only start the >>> service once, e.g >>> >>> service rsgd /system/bin/rsgd >>> oneshot >>> class main >>> user system >>> >>> >>> Hope that helps! >>> trevd >>> >>> >>> >>> On Wednesday, 4 June 2014 05:11:30 UTC+1, rsg wrote: >>>> >>>> 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.