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.

Reply via email to