Linux - Newbie This Linux forum is for members that are new to Linux.
Just starting out and have a question?
If it is not in the man pages or the how-to's this is the place! |
| Notices |
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
 |
GNU/Linux Basic Guide
This 255-page guide will provide you with the keys to understand the philosophy of free software, teach you how to use and handle it, and give you the tools required to move easily in the world of GNU/Linux. Many users and administrators will be taking their first steps with this GNU/Linux Basic guide and it will show you how to approach and solve the problems you encounter.
Click Here to receive this Complete Guide absolutely free. |
|
 |
06-28-2011, 09:52 PM
|
#1
|
|
LQ Newbie
Registered: Jun 2011
Posts: 6
Rep: 
|
return -1 of main but get exit code is 255? why? pls advise.
I learn C++ reading the <C++ primer 4th>, question1.2 let me test if return -1 how the compiler handle this exit code.
and in gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52), I get this show:
[youxi600@Arthas C++ Primer]$ cat q1_2.cpp
int main()
{
return -1;
}
[youxi600@Arthas C++ Primer]$ gcc q1_2.cpp -o q1_2
[youxi600@Arthas C++ Primer]$ ./q1_2
[youxi600@Arthas C++ Primer]$ echo $?
255
[youxi600@Arthas C++ Primer]$
anyone can give me an advise? Many thanks!
|
|
|
|
06-28-2011, 10:02 PM
|
#2
|
|
Guru
Registered: Mar 2004
Distribution: SusE 8.2
Posts: 5,861
Rep: 
|
Because 255 == 0xff == -1 for an 8-bit signed value 
|
|
|
1 members found this post helpful.
|
06-28-2011, 10:12 PM
|
#3
|
|
Member
Registered: Aug 2009
Distribution: CentOS
Posts: 692
|
Yes, the exit status is effectively an unsigned char. The relevant definition in /usr/include/bits/waitstatus.h is:
Code:
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
|
|
|
1 members found this post helpful.
|
06-28-2011, 10:20 PM
|
#4
|
|
LQ Newbie
Registered: Jun 2011
Posts: 6
Original Poster
Rep: 
|
Quote:
Originally Posted by paulsm4
Because 255 == 0xff == -1 for an 8-bit signed value 
|
But my main function return type is "int" not an 8-bit signed. Confused!
|
|
|
|
06-28-2011, 10:21 PM
|
#5
|
|
LQ Newbie
Registered: Jun 2011
Posts: 6
Original Poster
Rep: 
|
Quote:
Originally Posted by rknichols
Yes, the exit status is effectively an unsigned char. The relevant definition in /usr/include/bits/waitstatus.h is:
Code:
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
|
why? I have assume it's return type to "int".
|
|
|
|
06-28-2011, 11:14 PM
|
#6
|
|
Guru
Registered: Sep 2009
Location: Perth
Distribution: Manjaro
Posts: 6,312
|
So I will defer to paulsm4 for the C / C++ side as he is very experienced in these matters, but I think maybe you might be mixing apples and oranges.
Irrelevant of what is occurring within your code, the exit status in the shell can ONLY be between 0 and 255. So if you create a one line bash script:
Code:
#!/bin/bash
exit -1
This will give you the same result when looking at the exit code using $?. For that matter if you change it to -2 it will be 254 as it treats it like
a loop once past zero.
I am sure there is official information that others can give, but I just wanted to point out that the shell is the one here doing the translation and not your program
(even though it may be as well)
|
|
|
1 members found this post helpful.
|
06-29-2011, 01:16 AM
|
#7
|
|
Guru
Registered: Aug 2004
Location: Brisbane
Distribution: Centos 6.4, Centos 5.9
Posts: 14,985
|
Contrary to appearances, 'int' is not really a basic type; more accurately 'int' defaults to come combination of 8, 16, 32, 64 (or larger multiples of 2) bit, signed or unsigned.
Check your compiler manual & eg http://www.dummies.com/how-to/conten...bers-in-c.html
Last edited by chrism01; 06-29-2011 at 01:18 AM.
|
|
|
|
06-29-2011, 01:35 AM
|
#8
|
|
LQ Newbie
Registered: Jun 2011
Posts: 6
Original Poster
Rep: 
|
Quote:
Originally Posted by grail
So I will defer to paulsm4 for the C / C++ side as he is very experienced in these matters, but I think maybe you might be mixing apples and oranges.
Irrelevant of what is occurring within your code, the exit status in the shell can ONLY be between 0 and 255. So if you create a one line bash script:
Code:
#!/bin/bash
exit -1
This will give you the same result when looking at the exit code using $?. For that matter if you change it to -2 it will be 254 as it treats it like
a loop once past zero.
I am sure there is official information that others can give, but I just wanted to point out that the shell is the one here doing the translation and not your program
(even though it may be as well)
|
Thanks.
I think I can get your means. No matter which type the main returned, the "echo $?" shell command just ONLY get a unsigned 8-bit exit code.
And I find one book may be help explain this viewpoint.
The New Kornshell Command and Programming Language by Morris Bolsky and David Korn says:
Quote:
0 Normal exit.
1-125 Failure.
126 A command was found but cannot be executed.
127 A command could not be found.
128-255 Failure.
256 and above A command has exited because of reciept of a signal.
Version: With the 11/16/88 version of ksh, 129-160 indicated that a command had exited because of a signal....A command that could not be found or could not execute had a return value of 1.
|
|
|
|
06-29-2011, 01:38 AM
|
#9
|
|
LQ Newbie
Registered: Jun 2011
Posts: 6
Original Poster
Rep: 
|
Quote:
Originally Posted by chrism01
|
Thanks. I will check it.
|
|
|
|
06-29-2011, 07:55 AM
|
#10
|
|
LQ 5k Club
Registered: Sep 2009
Distribution: Arch x86_64
Posts: 6,443
|
Actually, the unsigned 8-bit exit code limitation is part of the kernel, not the shell.
Last edited by MTK358; 06-29-2011 at 10:56 AM.
|
|
|
|
06-29-2011, 10:49 AM
|
#11
|
|
Member
Registered: Aug 2009
Distribution: CentOS
Posts: 692
|
The only access to that "int" from main() is the value that is returned when the parent performs a wait() system call, which returns a 16-bit quantity with two 8-bit fields. One field is the low-order 8 bits of the exit status; the other field is the terminating signal. That's all that is available to any program.
|
|
|
1 members found this post helpful.
|
06-29-2011, 10:57 AM
|
#12
|
|
LQ 5k Club
Registered: Sep 2009
Distribution: Arch x86_64
Posts: 6,443
|
Quote:
Originally Posted by rknichols
The only access to that "int" from main() is the value that is returned when the parent performs a wait() system call, which returns a 16-bit quantity with two 8-bit fields. One field is the low-order 8 bits of the exit status; the other field is the terminating signal. That's all that is available to any program.
|
Does that mean that my above post is wrong?
Does the other field with the terminating signal have anything to do with main()'s return value?
|
|
|
|
06-29-2011, 07:41 PM
|
#13
|
|
Guru
Registered: Aug 2004
Location: Brisbane
Distribution: Centos 6.4, Centos 5.9
Posts: 14,985
|
I believe it's a bit of both.
Inside C, 'int' could be almost anything (see my post #7) if its setup to do so, but once you pass the value back to the shell, it can only represent/present an 8 bit value. Not sure if that's the shell or the kernel.
If it was the kernel, in theory it should be able to use anything up to the bit size of the kernel eg 32 or 64.
I suspect( and could be wrong) that it's a shell limit.
Answers on a postcard pls ... 
|
|
|
|
06-30-2011, 02:14 PM
|
#14
|
|
Member
Registered: Aug 2009
Distribution: CentOS
Posts: 692
|
Quote:
Originally Posted by MTK358
Does that mean that my above post is wrong?
Does the other field with the terminating signal have anything to do with main()'s return value?
|
No, it's just a signal number, and would be zero for a process that exited normally.
Code:
#define __WTERMSIG(status) ((status) & 0x7f)
#define __WIFEXITED(status) (__WTERMSIG(status) == 0)
It appears that the kernel might actually store the whole integer within the task_struct structure. It's just that the wait() system call returns only the low-order 8 bits of the exit code plus an 8-bit signal number all packed into the low order 16 bits of an integer. The macros for testing and extracting those fields are described in the wait(2) manpage and defined in /usr/include/bits/waitstatus.h.
Looking at that manpage, I see a slightly newer system call, waitid(), that looks like it might return the entire integer in the si_status member of the siginfo_t structure. For a C (or C++) program, it might be worth taking a look at that if you really need to see more than those low 8 bits of the exit status. I've never used waitid(2), so I'm not sure what is really returned.
Last edited by rknichols; 06-30-2011 at 02:19 PM.
|
|
|
|
| Thread Tools |
Search this Thread |
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -5. The time now is 04:16 AM.
|
|
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.
|
Latest Threads
LQ News
|
|