Solved

How to get the return code of program in C?

Posted on 2000-02-22
20
441 Views
Last Modified: 2010-04-15
Is it possible to get the return code of program if I use "system" function to call the program?
0
Comment
Question by:tan
  • 7
  • 5
  • 3
  • +4
20 Comments
 
LVL 3

Expert Comment

by:arnond
ID: 2545309
If you're using, DOS, you cann't system() returns 0 if it's successfull and -1 on error and sets 'errno' to an error message relvant to the failure.
In UNIX, it should work. I'll try and get back to you.

Arnon David.
0
 
LVL 3

Expert Comment

by:arnond
ID: 2545336
No. It doesn't work on UNIX too.

Sorry,
Arnon.
0
 

Author Comment

by:tan
ID: 2545402
I think I don't describe my question clearly. Assume that I have two programs, A and B. In program A, I use "system" function to call B. B will return a integer value by using "exit" or "return" statement in main function. Here is the question. Is it possible for A to get the return code from B?
0
NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

 
LVL 84

Expert Comment

by:ozo
ID: 2545411
yes
0
 
LVL 31

Expert Comment

by:Zoppo
ID: 2545422
Hi tan,

For DOS and Windows it should be possible to read the ERRORLEVEL variable to get the exit-status (somehow like 'echo %ERRORLEVEL%' in a dos box). Not sure what's similar in UNIX.

ZOPPO
0
 
LVL 3

Expert Comment

by:arnond
ID: 2545479
ozo, I tried runing these code segments and got some wrong outputs (on a UNIX machine)

a:
#include <stdio.h>
int main()
{
  int i;
  printf ("Enter number:\n");
  scanf ("%d",&i);
  return (i);  /*or also, exit (i), both didn't work.*/
}

b:
#include <stdio.h>
{
  int i=0;
  while (i!=99)
  {
     i=system("a");
     printf ("Got %d from a\n",i);
  }
  return (0);
}

and I get strange outputs from the printf() in b. what did I do wrong ?

Arnon.
0
 
LVL 84

Expert Comment

by:ozo
ID: 2545504
b: is missing main, but with that fixed, I get the expected output:

Enter number:
0
Got 0 from a
Enter number:
1
Got 256 from a
Enter number:
2
Got 512 from a
Enter number:
3
Got 768 from a
Enter number:
4
Got 1024 from a
Enter number:

0
 
LVL 2

Accepted Solution

by:
AndrewRodionov earned 100 total points
ID: 2545542
Hello tan!

In order to get exit code in parent program (A) from child program (B) you must use one of the spawn... functions. For example:

file a.c
#include <process.h>
#include <stdio.h>

int main()
{
  printf( "b return code is %d\n", spawnl( P_WAIT, "b", NULL ) );
  return 0;
}

file b.c
#include <stdio.h>

int main()
{
  printf( "I'm b program...\n" );
  return 1;
}

Just make them and check results.


Andrew Rodionov
0
 
LVL 3

Expert Comment

by:sreenathk
ID: 2545567
I also got the correct answers when I tried on DOS machine. But I did not tried on the UNIX machine. Just check the correct code in the UNIX machine.
Sreenath
0
 
LVL 3

Expert Comment

by:arnond
ID: 2545569
ozo, of course.... I forgot the int main() part. I got the same exact output as you got. why ?

Andrew, which OS do you use ?

Arnon.
0
 

Expert Comment

by:myokomiz
ID: 2545572
In Unix system command can return :

-1 if it could not execute your program
or
an integer. This return can be divided in two. Most significant byte is
  the exit code of your program executed by a system call and the less
  significant means:
     0 if the program terminated normally
  or
     signal number if it was terminated by a signal

So if you want catch the exit code of your program you must do like this

  printf ("Got %d from a\n", i/256 );
0
 
LVL 3

Expert Comment

by:sreenathk
ID: 2545581
I will give the code which I tried on the DOS machine. It is very simple. I did not use any spawnl().
File testa.c
#include <stdio.h>
int main()
{
      int i;
      scanf("%d",&i);
      return(i);
}

File testb.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
      int i;
      i = system("testa");
      printf("Got value from testa as %d\n",i);
      return 1;
}

And gave the correct results also. I mean what ever number I entered I got it back.
Sreenath
0
 
LVL 84

Expert Comment

by:ozo
ID: 2545593
arnond, were you expecting output like this?

#include <sys/wait.h>
printf ("Got %d from a\n",WEXITSTATUS(i));
0
 
LVL 2

Expert Comment

by:AndrewRodionov
ID: 2545625
for arnold:

Well, my example works under DOS and I compiled it by Borland C++ 3.1. On UNIX platform you can't use spawn... functions.

Andrew Rodionov
0
 
LVL 3

Expert Comment

by:arnond
ID: 2545646
ozo, I didn't but maybe myokomiz has a point, we got i*256 as the output.
Andrew and threenathk, that's strange, the help on system (borland c 3.1) says:
--------------------------------------------------------------------------------------------
Declaration:  int system(const char *command);

Remarks:
system invokes the DOS command interpreter file from inside an executing C program to execute a DOS command, batch file, or other program named by the "string "command.

To be located and executed, the program must be in the current directory or in one of the directories listed in the PATH string in the environment.

Because the COMSPEC environment variable is used to find the command interpreter file, the command interpreter file does not need to be in the current directory.

Return Value
On success, returns 0  
On error, returns -1 and sets errno to  
ENOENT, ENOMEM, E2BIG, or ENOEXEC, MEM, E2BIG, or ENOEXEC.
--------------------------------------------------------------------------------------------

so you can see why I said what I said.

Arnon. (not arnold....)
0
 
LVL 2

Expert Comment

by:AndrewRodionov
ID: 2545670
for Arnon:

I'm sorry for my clumsiness: you are definitely Arnon not arnold.

And in DOS under Turbo C/Borland C++ spawn... functions work!

Andrew Rodionov
0
 
LVL 2

Expert Comment

by:AndrewRodionov
ID: 2545705
So, myokomiz is right: for UNIX platform `system' return value contains the exit code in the high-order byte.

Andrew Rodionov
0
 
LVL 3

Expert Comment

by:arnond
ID: 2545717
Andrew, I guess now that I'm familiar with spawnl, this is the way to do in DOS. We'll just have to keep looking for something similar in UNIX (unless tan wouldn't need it....)

Arnon.
0
 
LVL 3

Expert Comment

by:arnond
ID: 2545730
too bad that we cann't get high exit values. system returns an int and if we want to return high values (like 1000 for example), we get an overflowed resault.

Arnon.
0
 
LVL 2

Expert Comment

by:AndrewRodionov
ID: 2545753
Arnon, I think the return code mechanism was invented for small alternatives exactly. In order to exchange data between programs we must use IPC (interprocess communication).

Andrew Rodionov
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

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

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
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 and use structures in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.

803 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