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: [email protected] 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 [email protected]. For more options, visit https://groups.google.com/d/optout.
