Provided by: libbobcat-dev_6.04.00-1ubuntu3_amd64 bug

NAME

       FBB::Proc - Runs external programs

SYNOPSIS

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

DESCRIPTION

       The FBB::Proc offers an alternative to the FBB::Process class. FBB::Proc offers an extensive interface to
       calling external programs and/or scripts from a C++ program (so-called child-processes). The class offers
       an  easy  to use, stream-based interface to communicate with the standard input, output and error streams
       of child processes.

       Objects of the class Proc use standard process-executing functions, like members of the  execl(2)  family
       or sh(1) to execute child processes. Thus, child processes can be executable programs or shell-scripts.

       The standard input, output and error streams of child processes may be accessed through their Proc parent
       objects.  Input  expected  by  child  processes  can  be  inserted into Proc objects. standard output and
       standard error generated by child processes  are  inserted  into  and  further  handled  by  std::ostream
       objects, by default std::cout and std::cerr.

       When  using  (output)  redirection  when executing child processes using the USE_SHELL path specification
       (see below for the path and IOMode specifications), the IGNORE_COUT  IOMode  (and  possibly  IGNORE_CERR)
       should normally be specified (cf. section ENUMERATIONS for a description of the IOMode enumeration).

       Proc  objects  may  repeatedly  be used to execute the same or different child processes. Before the next
       child process is started, the  Proc  object  ensures  that  its  currently  active  child  process  ends.
       Alternatively,  a  currently  active  child  process  ends  if  the Proc object goes out of scope, if the
       allotted execution time of the child process has passed,  if  a  new  process  is  started  using  Proc’s
       assignment operator, or if its stop member is called. Otherwise child processes continue until completion
       when calling finish or, if the child process reads its standard input stream, when the eoi manipulator is
       inserted into the Proc object.

       Programs  called  as  child processes may be specified when constructing a Proc object or by using Proc’s
       setCommand member. Proc constructors (or Proc’s setCommand-member) don’t start child processes. To  start
       child processes the start members or the assignment operator must be used.

       Child processes may receive information at their standard input streams through information inserted into
       Proc  objects.  In those cases Proc objects must inform their child processes that they have received all
       input. For this the eoi manipulator can be inserted into Proc objects, or Proc’s  finish  member  can  be
       called.

       If  information  sent  to  the  child  is not fully be processedd by the child process then the operating
       system issues a Broken pipe message, indicating that information in a pipe was lost, ending the  program.
       The Proc class’s member pipeSignal can be used to suppress the Broken pipe message.

       Arguments passed to child processes may be surrounded by double or single quotes. Arguments surrounded by
       double  quotes  have  their  double quotes removed, while interpreting any escape-sequences that may have
       been used within. Arguments surrounded by single quotes have their single quotes removed, while accepting
       their content as-is. In addition unquoted escape-sequences may be specified: those escape  sequences  are
       evaluated and replaced by their intended characters (e.g., \100 is converted to @).

       A full command specification may also be surrounded by backtics (`-characters). These backtick characters
       are removed by the Proc object when the command starts.

       Child  processes  may  be  allotted a limited amount of time (in seconds) to complete. By default no time
       limit is imposed upon child processes. If a time limit is specified then  the  child  process,  if  still
       running  after  the  specified  number of seconds, is ended by sending it a SIGTERM signal, followed by a
       SIGKILL signal (cf. signal(7)).

       By default the standard input, output and error streams of child processes  are  handled  by  their  Proc
       parent  processes: information inserted into the Proc object is forwarded to the child process’s standard
       input stream, information sent by the child process to its standard output and error streams  are  either
       forwarded  to  the  corresponding  streams  of  the  parent process, or they can be processed by streams,
       configured by the Proc object.

       Multiple Proc processes can be combined using the pipe operator (i.e., the | operator).  When  used,  the
       standard  output  stream  of the left-hand side (lhs) Proc object is used as the standard input stream of
       the right-hand side (rhs) Proc object. Since the Proc objects  start  their  own  child  processes,  this
       effectively  boils  down  to  the  output of the lhs’s child process being used as the input of the rhs’s
       child process. The leftmost Proc object may also read its input (using the pipe operator) from an istream
       object or from a file whose name (path) is specified as the most  lhs  argument  of  a  pipe  expression.
       Likewise,  the  rightmost  Proc object may pipe its standard output to an existing ostream object or to a
       file whose name (path) is specified as the most rhs argument of a pipe expression.

       Proc objects use Pipe objects (cf. pipe(3bobcat)) for communication with their child processes. To ensure
       that these pipes are properly closed the members waitForChild, stop or  the  eoi  manipulator  should  be
       used. Once a Proc object ceases to exist pipes to its child process are also closed.

NAMESPACE

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

INHERITS FROM

       FBB::Fork(3bobcat) (private),
       std::ostream

ENUMERATIONS

       The following enumerations are defined by the Proc class:

       enum ProcType:

       The enum ProcType defines how  a  child  proc  is  started  or  located.  Its  values  are  specified  at
       constructor-time  or  through  the  setProcType  member.  This enumeration defines the following symbolic
       constants:

       o      NO_PATH:
              The program specified as child proc is started as specified, without searching the elements of the
              PATH environment variable.

       o      USE_PATH:
              The elements of the PATH environment variable are used when  locating  the  program  specified  as
              child proc.

       o      USE_SHELL:
              The  program specified as child proc is called using /bin/sh -c. When (output) redirection is used
              with the specified command the IGNORE_COUT IOMode  (and  possibly  also  the  IGNORE_CERR  IOMode)
              should be specified.

       enum IOMode:

       Values  of  the enum IOMode are used to define which of the child proc’s standard streams can be accessed
       through the Proc object. Its symbolic constants may be combined using the bit_or operator. By default CIN
       | COUT | CERR is used (see below).

       IOMode arguments may be combined using bit-or operators.

       The following symbolic constants are available:

       o      ALL:
              Shortcut for CIN | COUT | CERR.

       o      CIN:
              Information inserted into the Proc object is forwarded to its child proc.  If this is not required
              then CIN should not be specified.

       o      CERR:
              Information written by the child process to its standard error stream is made available as  Proc’s
              standard error stream.  If this is not required then CERR should not be specified.

       o      COUT:
              Information written by the child process to its standard output stream is made available as Proc’s
              standard output stream.  If this is not required then CERR should not be specified.

       o      IGNORE_CERR:
              Information  written  by  the  child  proc to its standard error stream is ignored (i.e., not made
              available). An std::invalid_argument exception is thrown if this mode is specified in  combination
              with CERR, MERGE_COUT_CERR, and/or REPLACE.

       o      IGNORE_COUT:
              Information   written   by   the  child  proc  to  its  standard  output  stream  is  ignored.  An
              std::invalid_argument exception is thrown if this mode is  specified  in  combination  with  COUT,
              MERGE_COUT_CERR and/or REPLACE.

       o      IGNORE_COUT_CERR:
              Shortcut for IGNORE_CERR | IGNORE_COUT.

       o      MERGE_COUT_CERR:
              Information written by the child process to its standard output and standard error streams is made
              available  at  the  Proc  object’s  standard output stream.  An std::invalid_argument exception is
              thrown if this mode is specified in combination  with  COUT,  CERR,  IGNORE_COUT,  IGNORE_CERR  or
              REPLACE.

       o      NONE:
              The  Proc  object does not insert information into the standard input streams of its child process
              and information written by the child process to its  standard  output  or  error  streams  is  not
              forwarded to the Proc object. Instead, the child process processes its standard streams by itself.
              When this mode is specified in combination with other IOMode values it is silently ignored.

       o      REPLACE:
              When  starting a child proc (see below at the member start) the current process (i.e., the program
              defining the Proc object) is replaced by the  child  process,  inheriting  the  current  process’s
              standard  input and output streams. If this mode is specified in combination with any other IOMode
              (except for NONE, see below) an std::invalid_argument exception is thrown.

CONSTRUCTOR

       Note that child processes are not started automatically following the construction of t(Proc) objects.  A
       start member or the assignment operator (see below) is used to start child processes.

       Once a Proc object has been constructed its parameters can be changed using set-member functions or start
       members.

       o      explicit  Proc(std::string const &command = "", IOMode mode = ALL, ProcType type = NO_PATH, size_t
              bufSize = 200, size_t timeLimit = 0, bool pipeSignal = true):
              The parameter bufSize defines the size of the streambuf buffers  used  by  the  Proc  object.  The
              timeLimit  specifies the maximum execution time of a child process in seconds; when timeLimit == 0
              no execution time limit is used. When pipeSignal == true incomplete processing of information sent
              to or read from the child process results in a Broken pipe  exception,  terminating  the  program.
              When specifying false the Broken pipe exception is suppressed, and the input and/or output streams
              do not have to be completely processed (see also pipeSignal’s description).

       Copy and move constructors (and assignment operators) are not available.

OVERLOADED OPERATORS

       o      Proc &operator<<(Type value):
              This  operator  inserts  value  into the child’s standard input stream. I.e., the child proc reads
              value from its standard input. A value of any type that can be inserted into  an  ostream  can  be
              inserted  into  a  Proc  object.  Nothing  happens  if  the member is used when the child proc has
              terminated. Manipulators like std::endl are also supported.  The  behavior  of  this  operator  is
              undefined when IOMode CIN has not been specified.

       o      Proc &operator+=(std::string const &):
              This  operator adds the provided std::string object to the currently defined command specification
              of a Proc object. The member operator+=  does  not  add  a  separating  blank  space  between  the
              currently stored command specification and the text to append.  It merely adds its right-hand side
              string to the command stored so far. It does not affect a currently running child process.

       o      int operator=(std::string const &cmd):
              The  operator=  member  defines  cmd  as the stored command in a Proc object, and thereupon starts
              `cmd’ as its child process.

              Before starting the child process a possibly active child process  is  first  stopped  by  calling
              stop.  It  returns  stop’s  return  value. Immediately after calling stop the new command (cmd) is
              started. If ending and restarting another command should be separate actions then  use  finish  or
              stop  followed  by setCommand, followed by calling an appropriate overloaded version of the member
              start.

       o      Return operator|(Proc &lhs, Proc &rhs):
              This operator implements piping. Information sent by lhs to its standard output  is  used  as  the
              standard  input  of the rhs’s child process. The Return value is rhs if the expression is followed
              by another pipe-operator or it is void.

       o      Return operator|(std::istream &in, Proc &proc):
              This operator implements piping. Information read from in is read by  proc’s  child  process.  The
              Return value is proc if the expression is followed by another pipe-operator or it is void.

       o      Return operator|(std::string const &fname, Proc &proc):
              This  operator  implements piping. information in the file whose file (path) name is fname is read
              by proc’s child process. The Return value is  proc  if  the  expression  is  followed  by  another
              pipe-operator or it is void.

       o      void operator|(Proc &proc, std::ostream &out):
              This  operator  implements piping. Information sent by proc’s child process to its standard output
              stream is written to out.

       o      void operator|(Proc &proc, std::string &fname):
              This operator implements piping. Information sent by proc’s child process to its  standard  output
              stream is written to the file whose file (path) name is fname.

       The pipe (|) operator mimics the pipe-operator supported by most command-shell programs and should not be
       confused with the bit-or operator. The pipe operator allows constructions like

           p1 | p2 | p3            // piping 3 Proc objects
           cin | p1 | p2 | cout    // p1 reads cin, p2 writes cout
           inName | p1 | outName   // inName: file name of the file
                                   // read by p1, outName: file name
                                   // of the file written by p1

       When using the pipe operator Proc objects reading input automatically specify their CIN modes, while Proc
       objects   writing   their   standard  output  automatically  specify  their  COUT  modes.  Following  the
       pipe-expression the IOMode specifications which were specified before the pipe-expression are restored.

MEMBERS

       o      bool active():
              If the child proc is currently running true is returned and and false if not.

       o      void cerrMode(char const *lab) const:
              The label lab, followed by the a textual representation of  the  currently  configured  IOMode  is
              inserted into std::cerr.

       o      void cerrPipes(char const *lab) const:
              The  text Proc, followed by the Proc’s id, followed by label lab, followed by the currently active
              read and write file descriptors of the pipes currently used by the Proc object are  inserted  into
              std::cerr.

       o      std::string const &cmd() const:
              The currently specified child-process starting command is returned.

       o      int exitStatus() const:
              The last child-process’s exit-status is returned. If a child process is currently running or if no
              child process has yet been started -1 is returned.

       o      int finish():
              Waits  until  a currently active child process has ended and returns its exit status. If the child
              process isn’t currently running -1 is returned.

       o      IOMode ioMode() const:
              The IOMode currently used by the Proc object is returned.

       o      std::string mode() const:
              The IOMode currently used by the Proc object is returned as a text-string.

       o      int pid() const:
              The child process’s process-id is returned. The returned value is undefined if  no  child  process
              has  yet  been  started. If the child process has already completed the last child process’s id is
              returned.

       o      void pipeSignal(bool on):
              When incompletely forwarding information to a child process or  incompletely  reading  information
              from  a  child  process  a  Broken pipe may result, ending the currently running program. To avoid
              this, pipeSignal(false) can be called. To reactivate recognizing broken pipes pipeSignal(true) can
              be called. After using pipeSignal(false) failing insertions into  a  Proc  object  result  in  its
              member good returning false, and its members bad and fail returning true.

       o      size_t procIdx() const:
              Every  constructed  Proc  object  receives its own construction-order index. The first Proc object
              constructed in a program gets index value 0.

       o      ProcType procType() const:
              The ProcType used when starting child processes is returned.

       o      void setBufSize(size_t bufSize):
              The stream buffer size in bytes used by streams communicating  with  child  processes  is  set  to
              bufSize. A zero byte buffer size is silently changed into one.

       o      void setCommand(std::string const &cmd):
              The  (initial  part  of  a)  child process command specification is set to cmd. After calling this
              member operator+= can be used to append additional text to the command specification.

       o      void setIOMode(IOMode mode):
              The IOMode used when calling child processes is set  to  mode.   Note  that  pipe-expressions  may
              modify  the mode of Proc objects while the pipe-expression is executed. For details see the end of
              the OVERLOADED OPERATORS section.

       o      void setProcType(ProcType type):
              The ProcType used when starting child processes is set to type.

       o      void setTimeLimit(size_t timeLimit):
              The execution time limit of child processes is set to timeLimit (in seconds).  No  time  limit  is
              used  when  timeLimit 0 is specified. The time limit set by setTimeLimit is used when starting the
              next child process. When calling setTimeLimit then pipeSignal(timeLimit  ==  0)  is  automatically
              called. If that’s not intended, then explicitly call pipeSignal after calling setTimeLimit.

       o      void start(size_t timeLimit, IOMode mode = ALL, ProcType type = NO_PATH, size_t bufSize = 200):
              The  currently  specified  command  is started using the specified timeLimit, IOMode, ProcType and
              bufSize arguments. The start members do not alter the currently configured default values of their
              arguments.

              If a child process is still active when start is called it first calls stop to end  the  currently
              running child process

       o      void start(IOMode mode, ProcType type = NO_PATH, size_t bufSize = 200):
              Same  as the previous start member, but using the currently configured timeLimit and requiring the
              specification of the IOMode to use.

       o      void start():
              Same as the first start member, but using the currently configured timeLimit, IOMode, ProcType and
              bufSize values.

       o      int stop():
              A currently active child process is ended by calling Fork::endChild (see also fork(3bobcat)).

       o      void system(size_t timeLimit, IOMode mode = ALL, size_t bufSize = 200):
              The  currently  stored  command  is  executed  as  a  command  of  sh(1),  using   the   specified
              process-arguments.

       o      void system(IOMode mode = ALL, size_t bufSize = 200):
              Same as the previous system command, but using the default timeLimit specification.

       o      size_t timeLimit() const:
              The  currently  configured  execution  time  limit of Proc’s child process is returned. The return
              value zero indicates that no time limit is used.

       o      void useErr(std::ostream &out):
              The standard error output produced by the child process is sent to out. If  the  Proc  object  had
              specified IGNORE_CERR then that IOMode is unset, and the CERR mode is set.

       o      void useErr(std::string const &fname):
              Same  as  the previous member, but the child’s standard error output is written to the file (path)
              fname.

       o      void useMerge(std::ostream &out):
              The standard output and standard error output produced by the child process is sent to out. If the
              Proc object had specified CERR, COUT, IGNORE_CERR, or IGNORE_COUT then those  IOModes  are  unset,
              and the MERGE_COUT_CERR mode is set.

       o      void useMerge(std::string const &fname):
              Same  as the previous member, but the child’s standard output and standard error output is written
              to the file (path) fname.

       o      void useOut(std::ostream &out):
              The standard output produced by the child process is sent to out. If the Proc object had specified
              IGNORE_COUT then that IOMode is unset, and the COUT mode is set.

       o      void useOut(std::string const &fname):
              Same as the previous member, but the child’s standard output is written to the file (path) fname.

       o      int waitForChild():
              This member calls the identically named member from the  class  FBB::Fork,  waiting  for  a  child
              process  to  end.  When  calling  finish  or  using pipe-expressions waitForChild is automatically
              called.

EXAMPLES

       All examples should start with:

           #include <iostream>
           #include <bobcat/proc>

           using namespace std;
           using namespace FBB;

       The first example illustrates how a program only producing output can be called. Its child proc simply is
       /bin/ls:
       int main()
       {
           Proc proc("/bin/ls -Fla", Proc::COUT);

           proc.start();
       }

       The next example illustrates a child program that’s given a  limited  amount  of  execution  time:  lines
       entered at the keyboard are echoed to the standard output stream for at most 5 seconds:
       int main()
       {
           Proc proc("/bin/cat", Proc::CIN | Proc::COUT);
           proc.setTimeLimit(5);

           proc.start();

           while (true)
           {
               cout << "? ";
               string line;
               if (not getline(cin, line))
                   return 0;

               proc << line << endl;           // to /bin/cat

               if (not proc.good())
               {
                   cout << "child time limit exceeded\n";
                   break;
               }
           }

           cout << "/bin/cat time limit of 5 seconds reached: child proc ended\n";
       }

       Piping is illustrated next: information at the program’s standard input is piped to a second Proc object,
       writing its standard output to the program’s standard output stream:
       int main()
       {
           Proc proc1{ "/bin/cat" };
           Proc proc2{ "/bin/cat" };

           cin | proc1 | proc2;            // By default piping to cout. To do that
                                           // explicitly use ’... | proc2 | cout’
       }

FILES

       bobcat/proc - defines the class interface

SEE ALSO

       bobcat(7), execle(3), fork(3bobcat), process(3bobcat), ostream(3fork), sh(1)

BUGS

BOBCAT PROJECT FILES

       o      https://fbb-git.gitlab.io/bobcat/: gitlab project page;

       o      bobcat_6.04.00-x.dsc: detached signature;

       o      bobcat_6.04.00-x.tar.gz: source archive;

       o      bobcat_6.04.00-x_i386.changes: change log;

       o      libbobcat1_6.04.00-x_*.deb: debian package containing the libraries;

       o      libbobcat1-dev_6.04.00-x_*.deb: debian package containing the libraries, headers and manual pages;

BOBCAT

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

COPYRIGHT

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

AUTHOR

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

libbobcat-dev_6.04.00                               2005-2023                                 FBB::Proc(3bobcat)