Welcome
Example Code
C and C++
Argument Parsing
Create Subprocess
Create Thread
Is Subprocess Done
Non-Blocking File (Unix)
Mutex (Lock)
TCP Server
Wait For File (Unix)
Python
Non-Blocking Read

Monju System Architects



Code - C++ - Is Subprocess Done
Download: isSubprocessDone.cpp (the linked-to file is properly tabbed)
//  Copyright (c) 2007, Monju System Architects
//
//  Released under the Monju-Public copyright license:
//
//  Permission is hereby granted, free of charge, to any person or entity
//  obtaining a copy of this software and associated documentation files
//  (the "Software"), to deal in the Software without restriction,
//  including without limitation the rights to use, copy, modify, merge,
//  publish, distribute, sublicense, and/or sell copies and modifications
//  of the Software, and to permit persons to whom the Software is
//  furnished to do so, subject to the following conditions:
//
//  The above copyright notice and this permission notice shall be
//  included in all copies or substantial portions of published, sold, or
//  ownership-transferred versions of the Software. This notice is not
//  required for binary-only releases or binary-only derivatives of the
//  Software, or documentation provided with binary-only releases and
//  binary-only derivatives.
//
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
//  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.




//  INCLUDES.
#ifdef _WIN32
    #include <Windows.h>
#else
    #include <stdlib.h>
#endif



//  DEFINITIONS.
#ifdef _WIN32
    #define PROCESS_INFO    PROCESS_INFORMATION
#else
    #define PROCESS_INFO    int
#endif



//  isSubprocessDone()
//
//  Non-blocking call to determine if a subprocess has completed.  If the subprocess
//  terminates without an exit status (with a signal) and <pStatus> is not NULL, the 
//  status is set to -1.  Returns true if the subprocess has finished and false
//  otherwise.
bool isSubprocessDone(const PROCESS_INFO& processInfo, int* pStatus=NULL) {
    #ifdef _WIN32
        DWORD exitCode;
        if(0 ==  GetExitCodeProcess(processInfo.hProcess, &exitCode)) {
            return false;
        }
        if (pStatus != NULL) {
            *pStatus = exitCode;
        }
        return true;
    #else
        int status;
        int result = waitpid(processInfo, &status, WNOHANG);
        if (result < 0) {
            throw("waidpid error.");
        }
        if (result == 0) {
            return false;
        }
        if (!WIFEXITED(status)) {
            if (pStatus != NULL) {
                *pStatus = -1;
            } 
            return true;
        }
        if (pStatus != NULL) {
            *pStatus = WEXITSTATUS(*pStatus);
        }
        return true;
    #endif
}