• C

How to call a seperate C program from another?

Easy enough to do in COBOL, but I cannot find any examples of how it is done in C. Can someone please give me a code example of how I can call another C program (a completely self contained program that has its own main function), and check the results in the calling program.

Thank you for your help.
axdAsked:
Who is Participating?
 
hougaardConnect With a Mentor Commented:
// First Example - Spawn function

#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <errno.h>
#include <string.h>

void main()
  {
    int   process_id, status, rc;

    process_id = spawnl( P_NOWAIT, "child.exe",
             "child", "5", NULL );
    if( process_id == -1 ) {
      printf( "spawn failed - %s\n", strerror( errno ) );
      exit( EXIT_FAILURE );
    }
    printf( "Process id = %d\n", process_id );

#if defined(__OS2__) || defined(__NT__)
    rc = cwait( &status, process_id, WAIT_CHILD );
    if( rc == -1 ) {
      printf( "wait failed - %s\n", strerror( errno ) );
    } else {
      printf( "wait succeeded - %x\n", status );
      switch( status & 0xff ) {
      case 0:
      printf( "Normal termination exit code = %d\n",
            status >> 8 );
      break;
      case 1:
      printf( "Hard-error abort\n" );
      break;
      case 2:
      printf( "Trap operation\n" );
      break;
      case 3:
      printf( "SIGTERM signal not intercepted\n" );
      break;
      default:
      printf( "Bogus return status\n" );
      }
    }
#endif
    printf( "spawn completed\n" );
  }

/*
[child.c]
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

void main( int argc, char *argv[] )
  {
    int delay;

    if( argc <= 1 ) exit( EXIT_FAILURE );
    delay = atoi( argv[1] );
    printf( "I am a child going to sleep "
          "for %d seconds\n", delay );
    sleep( delay );
    printf( "I am a child awakening\n" );
    exit( 123 );

  }
*/

For Windows you can use the WinExec()

UINT WinExec(
    LPCSTR lpCmdLine,      // address of command line
    UINT uCmdShow       // window style for new application
   );


Hope this helps!

Erik
0
 
yonatCommented:
system("myprog.exe");
0
 
ozoCommented:
In what manner are the results given?
system should return the exit status of the program.
0
Managing Security Policy in a Changing Environment

The enterprise network environment is evolving rapidly as companies extend their physical data centers to embrace cloud computing and software-defined networking. This new reality means that the challenge of managing the security policy is much more dynamic and complex.

 
AlexVirochovskyCommented:
>>In what manner are the results given?
>>system should return the exit status of the program.

Can save results in File and read from 1-st Programm.
0
 
ozoCommented:
If the results are giben on stdout, you might
 system("myprog.exe > File");
or perhaps
 File = popen("myprog.exe", "r");
0
 
cmwCommented:
Use any of spawn.. functions (if you want to return to the calling program), or the exec.. if you want to transfer. These functions do not incure the memory overhead of loading the command processor (which system() does). You have the option of using the path, specifying a custom env, and picking up the result.
0
 
ozoCommented:
On the other hand, spawn is not part of ANSI C, so it may not be as portable as system
0
 
cmwCommented:
True, but then that's what using C is all about. Most of my experience is with Intel and MS stuff, and of the 5 or 6 compilers I've really worked with, all had the functions. If you're tight on mem, chances are you have the spawn.. stuff. Using windows/Unix'es memory probably isn't your main consideration.
0
 
sergelebelCommented:
keep in mind... if you need to pass multiple arguments to the child process, the spawn function is much more flexible...not to mention less memory ungry...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.