libassa 3.5.0
|
#include <Pipe.h>
Public Member Functions | |
Pipe () | |
A no-op constructor. | |
~Pipe () | |
Destructor calls close () first in an attempt to close opened pipe. | |
FILE * | open (const string &cmd_, const string &type_) |
Starts a subshell and feed it the string cmd_ to be executed. | |
int | close () |
Close the pipe. | |
int | kill () |
Kill subprocess with SIGTERM. | |
pid_t | pid () const |
Get subprocess' PID. | |
FILE * | fp () const |
Get pipe's standard I/O file pointer. | |
int | fd () const |
Get pipe's file descriptor. | |
Private Member Functions | |
Pipe (const Pipe &) | |
Pipe & | operator= (const Pipe &) |
Private Attributes | |
FILE * | m_fp |
A standard I/O stream descriptor. | |
pid_t | m_child_pid |
Supbrocess' PID. |
Pipe::Pipe | ( | ) |
A no-op constructor.
Definition at line 34 of file Pipe.cpp.
References ASSA::PIPE, and trace_with_mask.
: m_fp (NULL), m_child_pid (0) { trace_with_mask("Pipe::Pipe", PIPE); /* no-op */ }
Pipe::~Pipe | ( | ) |
Destructor calls close () first in an attempt to close opened pipe.
Definition at line 43 of file Pipe.cpp.
References close(), ASSA::PIPE, and trace_with_mask.
{ trace_with_mask("Pipe::~Pipe", PIPE); close (); }
ASSA::Pipe::Pipe | ( | const Pipe & | ) | [private] |
int Pipe::close | ( | void | ) |
Close the pipe.
The subprocess' status is collected to ensure that the child process have finished.
Definition at line 136 of file Pipe.cpp.
References m_child_pid, m_fp, ASSA::PIPE, and trace_with_mask.
Referenced by kill(), open(), and ~Pipe().
{ trace_with_mask("Pipe::close", PIPE); int ret = 0; if (m_child_pid == 0) { ret = EOF; } if (m_fp) { ret = fclose (m_fp); } m_fp = NULL; m_child_pid = 0; return ret == EOF ? -1 : 0; }
int ASSA::Pipe::fd | ( | ) | const [inline] |
FILE * ASSA::Pipe::fp | ( | ) | const [inline] |
int Pipe::kill | ( | ) |
Kill subprocess with SIGTERM.
You should most probably call close() afterwards to collect child process' status.
Definition at line 118 of file Pipe.cpp.
References ASSA::ASSAERR, close(), DL, m_child_pid, ASSA::PIPE, and trace_with_mask.
{ trace_with_mask("Pipe::kill", PIPE); #if !defined(WIN32) if (m_child_pid == 0) return -1; int ret = ::kill (m_child_pid, SIGTERM); close (); return ret; #else DL((ASSAERR|PIPE,"Not implemented for win32!\n")); return -1; #endif }
FILE * Pipe::open | ( | const string & | cmd_, |
const string & | type_ | ||
) |
Starts a subshell and feed it the string cmd_ to be executed.
The pipe is created and attached to the standard input or standard output of the subprocess, according to whether type_ is either "r" (read) or "w" (write). The other end of the pipe is returned to the calling code as a standard I/O stream, FILE, ready for buffered use with fprintf(), fscanf(), fgets, etc.
cmd_ | command to execute |
type_ | "w" for write pipe and "r" for read pipe |
Definition at line 51 of file Pipe.cpp.
References ASSA::ASSAERR, close(), DL, EL, fd(), ASSA::Fork::getChildPID(), ASSA::Fork::IGNORE_STATUS, ASSA::Fork::isChild(), ASSA::Fork::KILL_ON_EXIT, m_child_pid, m_fp, ASSA::PIPE, and trace_with_mask.
{ trace_with_mask("Pipe::open", PIPE); #if !defined(WIN32) // not yet implemented if (type_ != "r" && type_ != "w") { EL((ASSAERR,"Wrong type \"%s\"\n", type_.c_str ())); errno = EINVAL; return NULL; } int fd [2]; if (pipe (fd) < 0) { EL((ASSAERR,"failed: pipe(2)\n")); return NULL; } Fork f (Fork::KILL_ON_EXIT, Fork::IGNORE_STATUS); if (f.isChild ()) { if (type_ == "r") { ::close (fd [0]); if (fd [1] != STDOUT_FILENO) { dup2 (fd [1], STDOUT_FILENO); ::close (fd [1]); } } else { // 'w' ::close (fd [1]); if (fd [0] != STDIN_FILENO) { dup2 (fd [0], STDIN_FILENO); ::close (fd [0]); } } DL((PIPE,"Executing cmd: \"%s\"\n", cmd_.c_str ())); execl ("/bin/sh", "sh", "-c", cmd_.c_str (), (char* ) 0); EL((ASSAERR,"failed: execl(2)\n")); _exit (127); } /* parent */ if (type_ == "r") { ::close (fd [1]); if ((m_fp = fdopen (fd [0], type_.c_str ())) == NULL) { EL((ASSAERR,"failed: fdopen ()\n")); return NULL; } } else { // 'w' ::close (fd [0]); if ((m_fp = fdopen (fd [1], type_.c_str ())) == NULL) { EL((ASSAERR,"failed: fdopen ()\n")); return NULL; } } m_child_pid = f.getChildPID (); DL((PIPE,"m_child_pid = %d\n",m_child_pid)); return m_fp; #else DL((ASSAERR|PIPE,"Not implemented for win32!\n")); return NULL; #endif }
pid_t ASSA::Pipe::pid | ( | ) | const [inline] |
Get subprocess' PID.
Definition at line 102 of file Pipe.h.
References m_child_pid.
{ return m_child_pid; }
pid_t ASSA::Pipe::m_child_pid [private] |
FILE* ASSA::Pipe::m_fp [private] |