| Register | FAQ | Calendar | Search | Today's Posts | Mark Forums Read |
|
#1
| |||
| |||
| Hey group, 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. 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. So, is this the only way to create a simple daemon, or can you point us in other directions? -- /Thomas Løcke -- The major difference between a thing that might go wrong -- and a thing that cannot possibly go wrong is that when a -- thing that cannot possibly go wrong goes wrong it usually -- turns out to be impossible to get at or repair. |
|
#2
| |||
| |||
| Yes, it can hideous and unpleasant if you just use Gnat.Sockets and its children only. Just take any Client/Server written in C and do a line to line converting to the Ada corresponding routine. Now, if you really want to get hurt and do it the GNAT Ada way. Try using Cobra, in the Polyorb PCS package. And for a just simple messaging try the MOM, or SOAP sub-system, also include in the Polyorb package. Also, Polyorb does have examples that work for all protocols. Now, you can find Polyorb source package on "libre.adacore.com" download page. Just download, unpack and build the PCS system. In <488a3916$0$15889$edfadb0f@dtext01.news.tele.dk> , Thomas <me@pancon.dk> writes: >Hey group, > >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. 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. > >So, is this the only way to create a simple daemon, or can you point us >in other directions? > >-- >/Thomas Løcke > >-- The major difference between a thing that might go wrong >-- and a thing that cannot possibly go wrong is that when a >-- thing that cannot possibly go wrong goes wrong it usually >-- turns out to be impossible to get at or repair. |
|
#3
| |||
| |||
| 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 |
|
#4
| |||
| |||
| Jacob Sparre Andersen wrote: > Here's an (untested) implementation of Daemonize using "pure" Ada: > > [snip] Thank you Jacob! We will take a closer look at Ada and POSIX. Your implementation looks a lot more comprehensible. Regards, /Thomas |
![]() |
| Thread Tools | |
| Display Modes | |
In an effort to better serve ads to our visitors, cookies are used on objectmix.com. For more information, check out our Privacy Policy.