• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 276
  • Last Modified:

system() usage: I need to capture both the return code and the output

sounds simple... I hope so :-)

the system() command returns an int status code when it executes any command.. I need that so I can tell my calling function if the system() command was successful.  But the commands that will be running will also have stdout and/or stderr output that I need to capture and return to my caller.

Using system(), an answer would be to redirect output to a standard file by adding " >fileX 2>fileY " to the command, then reading those files afterwards.  But this worries me because I don't know what commands might be requested, and somebody might just try to redirect output themselves...

I also considered popen().. where I can easily capture the stdout.  But popen doesn't tell me if the command failed, nor does it provide a function for stderr.

Can anyone recommend a solution?

Thanks, George
1 Solution
Use 'popen()' instead of system:

/* POPEN.C: This program uses _popen and _pclose to receive a
 * stream of text from a system process.

#include <stdio.h>
#include <stdlib.h>

void main( void )

   char   psBuffer[128];
   FILE   *chkdsk;

        /* Run DIR so that it writes its output to a pipe. Open this
    * pipe with read text attribute so that we can read it
         * like a text file.
   if( (chkdsk = _popen( "dir *.c /on /p", "rt" )) == NULL )
      exit( 1 );

   /* Read pipe until end of file. End of file indicates that
    * CHKDSK closed its standard out (probably meaning it
         * terminated).
   while( !feof( chkdsk ) )
      if( fgets( psBuffer, 128, chkdsk ) != NULL )
         printf( psBuffer );

   /* Close pipe and print return value of CHKDSK. */
   printf( "\nProcess returned %d\n", _pclose( chkdsk ) );

PS: If you're not on Win32, remove the leading underscores from '_popen()' and '_pclose()'.
gljrAuthor Commented:

I had already written a routine using popen(), but it never
dawned on me to do a pclose(), let alone that the return from that value would indicate success/failure of the command in question.

You just made my day :-)

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

Tackle projects and never again get stuck behind a technical roadblock.
Join Now