exec.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:5k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: exec.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:04:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: exec.cpp,v 1000.2 2004/06/01 21:04:50 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Josh Cherry
  35.  *
  36.  * File Description:  execute another program, capturing output in strings
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/utils/exec.hpp>
  41. #include <corelib/ncbitime.hpp>
  42. #include <connect/ncbi_pipe.hpp>
  43. BEGIN_NCBI_SCOPE
  44. // run an executable using strings for std*
  45. int CExecute::Exec(const string& cmd,
  46.                    const vector<string>& args,
  47.                    const string& std_in,
  48.                    string& std_out,
  49.                    string& std_err,
  50.                    STimeout *timeout)
  51. {
  52.     // open a pipe, with text mode for std_in, std_out, and std_err
  53.     CPipe pipe;
  54.     // set up timeout, if requested
  55.     CStopWatch sw;
  56.     double max_time;
  57.     if (timeout) {
  58.         pipe.SetTimeout(eIO_Open, timeout);
  59.         pipe.SetTimeout(eIO_Close, timeout);
  60.         max_time = timeout->sec + timeout->usec / 1000000.0;
  61.         sw.Start();
  62.     }
  63.     pipe.Open(cmd.c_str(), args, CPipe::fStdErr_Open);
  64.     STimeout short_time = {0, 1};
  65.     pipe.SetTimeout(eIO_Read, &short_time);
  66.     pipe.SetTimeout(eIO_Write, &short_time);
  67.     size_t bytes_written;
  68.     size_t total_bytes_written = 0;
  69.     bool out_done = false;
  70.     bool err_done = false;
  71.     const size_t buf_size = 4096;
  72.     char buf[buf_size];
  73.     while (!out_done || !err_done) {
  74.         // write stdin
  75.         if (total_bytes_written < std_in.size()) {
  76.             pipe.Write(std_in.c_str() + total_bytes_written, 
  77.                        std_in.size() - total_bytes_written, 
  78.                        &bytes_written);
  79.             total_bytes_written += bytes_written;
  80.             if (total_bytes_written == std_in.size()) {
  81.                 pipe.CloseHandle(CPipe::eStdIn);
  82.             }
  83.         }
  84.         EIO_Status rstatus;
  85.         size_t bytes_read;
  86.         // read stdout
  87.         if (!out_done) {
  88.             rstatus = pipe.Read(buf, buf_size, &bytes_read);
  89.             std_out.append(buf, bytes_read);
  90.             if (rstatus != eIO_Success && rstatus != eIO_Timeout) {
  91.                 out_done = true;
  92.             }
  93.         }
  94.         // read stderr
  95.         if (!err_done) {
  96.             rstatus = pipe.Read(buf, buf_size, &bytes_read, CPipe::eStdErr);
  97.             std_err.append(buf, bytes_read);
  98.             if (rstatus != eIO_Success && rstatus != eIO_Timeout) {
  99.                 err_done = true;
  100.             }
  101.         }
  102.         // check whether total time (timeout paramater) exceeded
  103.         if (timeout) {
  104.             if (sw.Elapsed() > max_time) {
  105.                 pipe.SetTimeout(eIO_Close, &short_time);
  106.                 break;
  107.             }
  108.         }
  109.     }
  110.     int exit_value;
  111.     pipe.Close(&exit_value);
  112.     // return the value with which the process exited
  113.     return exit_value;
  114. }
  115. END_NCBI_SCOPE
  116. /*
  117.  * ===========================================================================
  118.  * $Log: exec.cpp,v $
  119.  * Revision 1000.2  2004/06/01 21:04:50  gouriano
  120.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  121.  *
  122.  * Revision 1.7  2004/05/21 22:27:51  gorelenk
  123.  * Added PCH ncbi_pch.hpp
  124.  *
  125.  * Revision 1.6  2003/11/17 21:43:52  jcherry
  126.  * Big change to deal properly with long input and output
  127.  *
  128.  * Revision 1.5  2003/09/25 19:10:30  jcherry
  129.  * Moved exec.?pp to gui/utils
  130.  *
  131.  * Revision 1.4  2003/09/25 17:36:27  jcherry
  132.  * Renamed CExec to CExecute to avoid name conflict.  Made Exec()
  133.  * really return the process's exit status.
  134.  *
  135.  * Revision 1.3  2003/09/09 22:45:47  jcherry
  136.  * Added timeout
  137.  *
  138.  * Revision 1.2  2003/09/02 23:12:02  jcherry
  139.  * Partial accommodation of changes to CPipe
  140.  *
  141.  * Revision 1.1  2003/07/28 18:19:42  jcherry
  142.  * Initial version
  143.  *
  144.  * ===========================================================================
  145.  */