[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: fork and vfork and daemon processes



Hi Matthew,
you can read all about elinux fork and vfork in elinux/Documentation/elinux.txt.
You will have to modify your daemon function accordingly.

Best Regards
/Jonas

> -----Original Message-----
> From: matthew.hook@xxxxxxx.nz">mailto:matthew.hook@xxxxxxx.nz]
> Sent: Sunday, March 11, 2001 10:45 PM
> To: dev-etrax@xxxxxxx.com
> Subject: fork and vfork and daemon processes
> 
> 
> Hi,
> 
> I'm a little new to Linux programming so bare with me.
> 
> I read somewhere that fork is partially implemented... it 
> works but you
> have to be careful in your code.
> What I'm trying to do is turn my regular application that 
> accesses both com
> ports to function correctly
> as a daemon process.   I've tried a number of different 
> daemon types of
> detach routines but for some
> reason when run from inittab the processes cause the whole 
> ETRAX board to
> behave in an odd way.
> It's as though the ETRAX board is resetting during boot or 
> something.  Has
> anyone had similar difficulties?
> If you have, how did you overcome the problems? was it due to fork() ?
> 
> By the way, I don't think it would be an issue but just in 
> case, I'm using
> C++
> 
> Here is the code I'm using, taken from the UNIX programming FAQ
> 
> /* closeall() -- close all FDs >= a specified value */
> 
> void closeall(int fd)
> {
>     //int fdlimit = sysconf(_SC_OPEN_MAX);  // appears to be 
> no sysconf
> function??
>     int fdlimit = 3;
> 
>     while (fd < fdlimit)
>       close(fd++);
> }
> 
> /* daemon() - detach process from user and disappear into the 
> background
>  * returns -1 on failure, but you can't do much except exit 
> in that case
>  * since we may already have forked. This is based on the BSD version,
>  * so the caller is responsible for things like the umask, etc.
>  */
> int daemon(int nochdir, int noclose)
> {
>     switch (fork())
>     {
>         case 0:  break;
>         case -1: return -1;
>         default: _exit(0);          /* exit the original process */
>     }
> 
>     if (setsid() < 0)               /* shoudn't fail */
>       return -1;
> 
>     /* dyke out this switch if you want to acquire a control tty in */
>     /* the future -- not normally advisable for daemons */
> 
>     switch (fork())
>     {
>         case 0:  break;
>         case -1: return -1;
>         default: _exit(0);
>     }
> 
>     if (!nochdir)
>       chdir("/");
> 
>     if (!noclose)
>     {
>         closeall(0);
>         open("/dev/null",O_RDWR);
>         dup(0); dup(0);
>     }
> 
>     return 0;
> }
> 
> CAUTION:  The information contained in this mail message is
> confidential and may be legally privileged. No confidentiality
> or privilege is waived or lost by any mistransmission. If the
> reader of this message is not the intended recipient, you are
> hereby notified that any use, dissemination, or reproduction of
> this message is prohibited. If you have received this message in
> error please notify the sender immediately by email and destroy
> the original message. Thank you.
>