[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

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

Posted on 2002-07-16
2
Medium Priority
?
275 Views
Last Modified: 2010-04-15
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
0
Comment
Question by:gljr
2 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 400 total points
ID: 7157845
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()'.
0
 

Author Comment

by:gljr
ID: 7157940
MAGNIFICO!!!!

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 :-)
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
Examines three attack vectors, specifically, the different types of malware used in malicious attacks, web application attacks, and finally, network based attacks.  Concludes by examining the means of securing and protecting critical systems and inf…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.
Suggested Courses

834 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question