trusty (3) fork.3bobcat.gz

Provided by: libbobcat-dev_3.19.01-1ubuntu1_amd64 bug

NAME

       FBB::Fork - Implements fork(2) using the Template Design Pattern

SYNOPSIS

       #include <bobcat/fork>
       Linking option: -lbobcat

DESCRIPTION

       FBB::Fork  objects  may  be  used  to implement the fork(2) call as part of the Template Algorithm Design
       Pattern. The class was designed as a virtual base class for classes implementing the essential  parts  of
       the  forking  process.  The  class  is  a  virtual base class. Derived classes must implement the members
       childProcess() and parentProcess() as part of the `Template Method Design Pattern’  (see  Gamma  et  al.,
       1995).

       Terminating  child  processes  send  SIGCHLD signals to their parents. The C library offers the following
       macros to analyze the status values received by the parent process using a wait(2) or  waitpid(2)  system
       call:

       o      int WIFEXITED(int status):
              This  macro  returns  a  nonzero  value  if  the  child process terminated normally with `exit’ or
              `_exit’.

       o      int WEXITSTATUS(int status):
              If `WIFEXITED’ is true of `status’, this macro returns the low-order 8 bits  of  the  exit  status
              value from the child process.

       o      int WIFSIGNALED(int status):
              This  macro  returns  a nonzero value if the child process terminated because it received a signal
              that was not handled.

       o      int WTERMSIG(int status):
              If `WIFSIGNALED’ is true of `status’, this macro returns the signal  number  of  the  signal  that
              terminated the child process.

       o      int WCOREDUMP(int status):
              This macro returns a nonzero value if the child process terminated and produced a core dump.

       o      int WIFSTOPPED(int status):
              This macro returns a nonzero value if the child process is stopped.

       o      int WSTOPSIG(int status):
              If  `WIFSTOPPED’  is  true  of  `status’,  this macro returns the signal number of the signal that
              caused the child process to stop.

NAMESPACE

       FBB
       All constructors, members, operators and manipulators, mentioned in this man-page,  are  defined  in  the
       namespace FBB.

INHERITS FROM

       -

CONSTRUCTORS

       o      Fork():
              This is the only available constructor.  Note that there is no copy constructor.

DESTRUCTOR

       o      virtual ~Fork():
              Derived  classes  may  define their own destructor, which is called when the ~Fork() destructor is
              activated.

MEMBER FUNCTIONS

       o      void fork():
              Performs the actual forking. It is implemented in such a way that the  corresponding  parent-  and
              child-  processes are activated from virtual members of FBB::Fork. If the forking operation fails,
              an FBB::Exception exception is thrown.

PROTECTED MEMBER FUNCTIONS

       o      virtual void childProcess() = 0:
              This member must be implemented by derived classes. It defines the actions that are  performed  by
              the  child  process,  following  the  fork(2)  system  call. Just before childProcess() is called,
              childRedirections() (see below) has been executed. The childProcess()  function  should  terminate
              the  child  process.  A  good  way  to do this is to throw an exeption which is caught by main()’s
              function try block. Terminating a process using exit(2) is deprecated in C++.

       o      virtual void childRedirections():
              This function may be redefined in derived classes to set up the redirections that are necessary to
              communicate  with  the  parent  process.  See also the classes redirector(3bobcat), pipe(3bobcat),
              ipipe(3bobcat) and opipe(3bobcat). By default, childRedirections() does nothing.

       o      virtual void parentProcess() = 0:
              This member must be implemented by derived classes. It defines the actions that are  performed  by
              the  parent  process,  following  the  fork(2) system call. Just before parentProcess() is called,
              parentRedirections() (see below) has been executed.

       o      virtual void parentRedirections():
              This function may be redefined in derived classes to set up the redirections that are necessary to
              communicate  with,  e.g.,  the  parent. See, e.g., the classes redirector(3bobcat), pipe(3bobcat),
              ipipe(3bobcat) and opipe(3bobcat). By default, parentRedirections() does nothing.

       o      pid_t pid() const:
              Returns the child’s process id in the parent’s code (i.e., in the parent-members below), and 0  in
              the  child’s  code  (i.e.,  in the child-members below). Note that the value of pid() is undefined
              when called before the member fork() has been called.

       o      void prepareDaemon() const:
              Prepares for a daemon childprocess. This function may (should) be called  from  childProcess()  to
              ensure  that  the  child  process changes its current working directory to the root (/) directory,
              thus freeing up mount points; that the child process starts a new session/process group  to  allow
              the parent (group leader) to kill all its processes without terminating the daemon; and makes sure
              that the child process closes and reopens the standard streams by associating them with  /dev/null
              to  prevent  ghost  input  and  output  actions  from  interfering  with  the daemon’s actions. An
              FBB::Exception is thrown if changing directory to the root directory fails.

       o      int waitForChild():
              This member may be called by parentProcess() to wait for the completion of the child-process.  The
              return  value  (exit-code)  of  the child process is returned as a value between 0 and 255. If the
              child process terminates before the completion of the parent process, then  waitForChild()  should
              be  called  to  prevent  zombies  from  occurring. Alternatively, the parent process may terminate
              (e.g., using exit(2)) while the child process is still alive. This is the normal way to  create  a
              daemon process.

EXAMPLE

       #include <iostream>
       #include <unistd.h>

       #include <bobcat/fork>

       using namespace std;
       using namespace FBB;

       class Background: public Fork
       {
           public:
               void childProcess();
               void parentProcess();
       };

       void Background::childProcess()
       {
           for (int idx = 0; idx < 3; ++idx)
           {
               cout << "Hello world # " << idx << endl;
               sleep(1);
           }
           throw 0;    // caught in main()
       }

       void Background::parentProcess()
       {
           cout << "Waiting for the child process to end...\n";

           cout << "The child returns value " << waitForChild() << endl;
       }

       int main()
       try
       {
           Background bg;

           bg.fork();
           cout << "This is from the parent\n";

           return 0;
       }
       catch(int x)
       {
           cout << "The child terminates with: " << x << endl;
           return x;
       }

FILES

       bobcat/fork - defines the class interface

SEE ALSO

       bobcat(7),   ipipe(3bobcat),   fork(2),   opipe(3bobcat),  pipe(3bobcat),  redirector(3bobcat),  wait(2),
       waitpid(2)

BUGS

       None Reported.

DISTRIBUTION FILES

       o      bobcat_3.19.01-x.dsc: detached signature;

       o      bobcat_3.19.01-x.tar.gz: source archive;

       o      bobcat_3.19.01-x_i386.changes: change log;

       o      libbobcat1_3.19.01-x_*.deb: debian package holding the libraries;

       o      libbobcat1-dev_3.19.01-x_*.deb: debian package holding the libraries, headers and manual pages;

       o      http://sourceforge.net/projects/bobcat: public archive location;

BOBCAT

       Bobcat is an acronym of `Brokken’s Own Base Classes And Templates’.

       This is free software, distributed under the terms of the GNU General Public License (GPL).

AUTHOR

       Frank B. Brokken (f.b.brokken@rug.nl).