diff --git a/libinterp/corefcn/module.mk b/libinterp/corefcn/module.mk
--- a/libinterp/corefcn/module.mk
+++ b/libinterp/corefcn/module.mk
@@ -63,16 +63,17 @@ COREFCN_INC = \
   %reldir%/oct-fstrm.h \
   %reldir%/oct-handle.h \
   %reldir%/oct-hdf5-types.h \
   %reldir%/oct-hist.h \
   %reldir%/oct-iostrm.h \
   %reldir%/oct-map.h \
   %reldir%/oct-obj.h \
   %reldir%/oct-prcstrm.h \
+  %reldir%/oct-proc.h \
   %reldir%/oct-procbuf.h \
   %reldir%/oct-stdstrm.h \
   %reldir%/oct-stream.h \
   %reldir%/oct-strstrm.h \
   %reldir%/oct.h \
   %reldir%/octave-default-image.h \
   %reldir%/octave-link.h \
   %reldir%/pager.h \
@@ -198,16 +199,17 @@ COREFCN_SRC = \
   %reldir%/mgorth.cc \
   %reldir%/nproc.cc \
   %reldir%/oct-fstrm.cc \
   %reldir%/oct-hdf5-types.cc \
   %reldir%/oct-hist.cc \
   %reldir%/oct-iostrm.cc \
   %reldir%/oct-map.cc \
   %reldir%/oct-prcstrm.cc \
+  %reldir%/oct-proc.cc \
   %reldir%/oct-procbuf.cc \
   %reldir%/oct-stream.cc \
   %reldir%/oct-strstrm.cc \
   %reldir%/oct-tex-lexer.ll \
   %reldir%/oct-tex-parser.h \
   %reldir%/oct-tex-parser.yy \
   %reldir%/octave-link.cc \
   %reldir%/ordschur.cc \
diff --git a/libinterp/corefcn/oct-proc.cc b/libinterp/corefcn/oct-proc.cc
new file mode 100644
--- /dev/null
+++ b/libinterp/corefcn/oct-proc.cc
@@ -0,0 +1,88 @@
+/*
+
+Copyright (C) 1995-2018 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Octave is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<https://www.gnu.org/licenses/>.
+
+*/
+
+#include <iostream>
+#include <sstream>
+
+#include "oct-proc.h"
+#include "procstream.h"
+#include "sysdep.h"
+#include "oct-syscalls.h"
+
+namespace octave 
+{
+  namespace sys 
+  {
+    process_execution_result
+    process_execution_result::of_success (int exit_status, std::string stdout_output)
+    {
+      return process_execution_result (0, exit_status, stdout_output, "");
+    }
+
+    process_execution_result
+    process_execution_result::of_error (int status, std::string err_msg)
+    {
+      return process_execution_result (status, -1, "", err_msg);      
+    }
+
+    // Execute a shell command, returning results as a C++ object
+    process_execution_result
+    run_command_and_return_output (const std::string& cmd_str)
+    {
+      iprocstream cmd (cmd_str.c_str ());
+      if (! cmd)
+        return process_execution_result::of_error (-1, std::string ("unable to start subprocess for '")
+          + cmd_str + "'");
+
+      int fid = cmd.file_number ();
+
+      std::ostringstream output_buf;
+
+      char ch;
+
+      for (;;)
+        {
+          if (cmd.get (ch))
+            output_buf.put (ch);
+          else
+            {
+              if (! cmd.eof () && errno == EAGAIN)
+                {
+                  cmd.clear ();
+                }
+              else
+                break;
+            }
+        }
+
+      int cmd_status = cmd.close ();
+
+      if (octave::sys::wifexited (cmd_status))
+        cmd_status = octave::sys::wexitstatus (cmd_status);
+      else
+        cmd_status = 127;
+
+      return process_execution_result::of_success (cmd_status, output_buf.str ());
+    }
+
+  }
+}
diff --git a/libinterp/corefcn/oct-proc.h b/libinterp/corefcn/oct-proc.h
new file mode 100644
--- /dev/null
+++ b/libinterp/corefcn/oct-proc.h
@@ -0,0 +1,84 @@
+/*
+
+Copyright (C) 1996-2018 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Octave is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<https://www.gnu.org/licenses/>.
+
+*/
+
+#if ! defined (oct_proc_h)
+#define oct_proc_h 1
+
+#include "octave-config.h"
+
+#include <string>
+#include <sys/types.h>
+
+namespace octave
+{
+  namespace sys
+  {
+    class
+    process_execution_result
+    {
+    public:
+
+      process_execution_result ()
+        : m_status(-1), m_err_msg(""), m_exit_status(-1), m_stdout_output("") { }
+
+      process_execution_result (int status, int exit_status, std::string stdout_output, std::string err_msg)
+        : m_status(status), m_err_msg(err_msg), m_exit_status(exit_status), m_stdout_output(stdout_output)
+           { }
+
+      static
+      process_execution_result
+      of_success(int exit_status, std::string stdout_output);
+
+      static
+      process_execution_result
+      of_error(int status, std::string err_msg);
+
+      int status (void) const { return m_status; }
+
+      int exit_status (void) const { return m_exit_status; }
+
+      std::string err_msg (void) const { return m_err_msg; }
+
+      std::string stdout_output (void) const { return m_stdout_output; }
+
+    private:
+
+      // launch status of the process, 0 for success, nonzero for error
+      int m_status;
+
+      // error message if executing command failed
+      std::string m_err_msg;
+
+      // exit status of the process
+      int m_exit_status;
+
+      // collected stdout output of the process
+      std::string m_stdout_output;
+
+    };
+
+    extern OCTAVE_API process_execution_result
+    run_command_and_return_output (const std::string& cmd_str);
+  }
+}
+
+#endif
\ No newline at end of file
