comp.lang.ada
 help / color / mirror / Atom feed
From: Jacob Sparre Andersen <jspa@nykredit.dk>
Subject: Re: Ada daemon
Date: Tue, 29 Jul 2008 02:05:52 -0700 (PDT)
Date: 2008-07-29T02:05:52-07:00	[thread overview]
Message-ID: <2d794119-2f5e-4f3a-b679-314b159d1b16@p25g2000hsf.googlegroups.com> (raw)
In-Reply-To: 488a3916$0$15889$edfadb0f@dtext01.news.tele.dk

Thomas wrote:

> My good friend Dwight and I are wondering about how to create a daemon
> in Ada. So far we've only been able to locate this example:
>
> http://www.pegasoft.ca/resources/boblap/16.html#16.26
>
> which honestly looks both hideous and unpleasant, to us.

Systems programming isn't always beautiful.  The trick is to notice
that almost all the code you see is actually a reusable library.
Also, several of the subprograms in the library do actually exist in
the POSIX packages, so there's no need to manually bind to the C
versions of the subprograms.

In practice the important part of daemonizing a process is to
disconnect Standard_Input, Standard_Output and Standard_Error.  You
can do this with:

   POSIX.IO.Close (File => POSIX.IO.Standard_Input);
   POSIX.IO.Close (File => POSIX.IO.Standard_Output);
   POSIX.IO.Close (File => POSIX.IO.Standard_Error);

> Yes, it might
> be because we're just a bunch of beginners, but still we were hoping for
> a "prettier", more Ada like approach. This one seems to rely on a lot of
> pragma import C stuff.

Using the POSIX standard packages definitely makes it prettier.

> So, is this the only way to create a simple daemon, or can you point us
> in other directions?

Here's an (untested) implementation of Daemonize using "pure" Ada:

with
  POSIX.IO,
  POSIX.Process_Environment,
  POSIX.Process_Identification,
  POSIX.Unsafe_Process_Primitives;

procedure Daemonize is
begin
   POSIX.Process_Environment.Change_Working_Directory ("/");

   for File in POSIX.IO.File_Descriptor'Range loop
      if POSIX.IO.Is_Open (File) then
         POSIX.IO.Close (File);
      end if;
   end loop;

   case POSIX.Unsafe_Process_Primitives.Fork is
      when -1 =>
         POSIX.Process_Primitives.Exit_Process
(POSIX.Process_Primitives.Failed_Creation_Exit);
      when 0 =>
         declare
            Session_Leader :
POSIX.Process_Identification.Process_Group_ID;
         begin
            POSIX.Process_Identification.Create_Session
(Session_Leader);
         end;
      when others =>
         POSIX.Process_Primitives.Exit_Process;
   end case;
end Daemonize;

On Debian you need to install the package "libflorist-dev", to have
access to the POSIX packages.

/Jacob



  parent reply	other threads:[~2008-07-29  9:05 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-25 20:35 Ada daemon Thomas
2008-07-25 23:14 ` anon
2008-07-29  9:05 ` Jacob Sparre Andersen [this message]
2008-07-29  9:29   ` Thomas Locke
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox