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
next prev 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