11-06-2012
void exit(int status)
pid_t wait(int *stat_loc);
As already mentioned, only the low 8 bits of exit()'s int argument, status, are meaningful. The rest are practically ignored. However, it is an error to assume that the low 8 bits written by wait() to stat_loc are the low 8 of exit()'s status. This is often not the case. Since the layout of wait()'s *stat_loc bitmask is implementation dependent, POSIX specifies macros for examination and retrieval.
The 139 "exit status" in Gaurav's post isn't a true exit status. When a process exits abnormally, the bits which encode exit status have no meaningful value (which is why you are required to consult WIFEXITED() to confirm that the process exited normally before examining the exit status with WEXITSTATUS()).
If it's not an exit status, then what is it? If it wasn't an exit() argument, and if it wasn't main()'s return value, and if it's not provided by the kernel, then where does the 139 come from?
Before checking the exit status of it's child, the shell confirms that it exited normally, with WIFEXITED(). When the confirmation fails, the shell consults WIFSIGNALED(). Determining that the process was signaled and terminated abnormally, the signal number is retrieved with WTERMSIG(). By convention, the shell adds 128 to the signal number and stores that result in its ? parameter.
If your C code wait()ed on a process that was killed by that same signal, in the signal bits examined by WTERMSIG(), it would see 11 and not 139.
To avoid ambiguity, if you plan to invoke your binaries with the shell, it's a good idea to keep to exit values in the range 0 to 125 inclusive. The remaining values are spoken for: 126 (command found but not executable), 127 (command not found), and values larger than 128 (signal number + 128).
(Some of the following may be x86 specific.)
Returning to the original question: Where is the exit status stored? Inside the kernel.
When you call exit(n), the least significant 8 bits of the integer n are written to a cpu register. The kernel system call implementation will then copy it to a process-related data structure.
What if your code doesn't call exit()? The c runtime library responsible for invoking main() will call exit() (or some variant thereof) on your behalf. The return value of main(), which is passed to the c runtime in a register, is used as the argument to the exit() call.
When the parent calls wait(stat_loc), the exit status value (along with other status information) is copied from the kernel process structure to the address pointed to by wait()'s stat_loc.
Once a dead process is wait()'d on and its status information delivered, the kernel can destroy that process' data structure. Until then, the lingering data structure is the hallmark of a zombie.
Regards,
Alister
Last edited by alister; 11-06-2012 at 10:10 PM..
Reason: amend stack statement (register is used)
10 More Discussions You Might Find Interesting
1. Programming
i just finished a project for a c++ class that i wrote at home on my computer, compiled with gcc. when i brought the code into school it would not compile, it would complain that cannot call main() function. at school we use ancient borland c++ from 1995. anyway my program has 20 different... (3 Replies)
Discussion started by: norsk hedensk
3 Replies
2. Programming
What is the sytax to return an int from C program main back to calling shell?
#!/usr/bin/ksh
typeset -i NO_RECS
$NO_RECS=process_file
# Process file is a C program that is set up to return an int from main. The
#program complies with no issues, but an error is generated when the... (3 Replies)
Discussion started by: flounder
3 Replies
3. Programming
Is it possible to execute any function before main() function in C or C++. (6 Replies)
Discussion started by: arun.viswanath
6 Replies
4. Programming
Hi,
I have a main loop which calls a sub loop, which finally returns to the main loop itself. The main loop runs when a flag is set. Now, I have a signal handler for SIGINT, which resets the flag and thus stops the main loop. Suppose I send SIGINT while the program is in subloop, I get an error... (1 Reply)
Discussion started by: Theju
1 Replies
5. Shell Programming and Scripting
awk -vwgt=$vWeight -vfac=$vFactor '
BEGIN {
printf("wgt:" wgt "\n");
printf("factor:" fac "\n");
total = sprintf("%.0f", wgt * fac);
total2 = sprintf("%.0f", int(wgt * fac));
printf("total:" total "\n");
printf("total2:" total2 "\n");
}
'
if
vWeight=326.4
vFactor=100
the result... (2 Replies)
Discussion started by: qa.bingo
2 Replies
6. Shell Programming and Scripting
Hi,
I am having issue with awk command . This command is running in the command prompt but inside a shell script.
awk -F'| ' 'int($1)==$1 && int($3) ==$3' int_check.txt
$cat int_check.txt
123|abc|123x
234|def|345
When i run it inside a shell script i am getting the error
"bailing... (5 Replies)
Discussion started by: ashwin3086
5 Replies
7. Shell Programming and Scripting
Hello, I have the below perl function int to return the integer value from the expression but it is not. I am not sure if something misses out here. Any help on this? Thanks in advance.
# Code sample Start
my $size = int (`1134 sample_text_here`);
print "$size \n";
# Code end
----------... (0 Replies)
Discussion started by: nmattam
0 Replies
8. Programming
Hi,
from the manual
listen(2): listen for connections on socket - Linux man page
It has a parameter called backlog and it limits the maximum length of queue of pending list.
If I set backlog to 128, is it means no more than 128 packets can be handled by server?
If I have three... (3 Replies)
Discussion started by: sehang
3 Replies
9. Programming
Hi friends,
when I am passing arguments to main, I want another function to be able to have access to that function, the problem is that I am creating athread, which has a function like void *xyz(void *), how can pass the refernce of argv to this function, if you see my program, you will better... (2 Replies)
Discussion started by: gabam
2 Replies
10. UNIX for Beginners Questions & Answers
Hi. I have some code, that for some reason, I could not post it here in this post. Here's the address for it:
#if 0 shc Version 4.0.1, Generic Shell Script Compiler GNU GPL Version 3 Md - Pastebin.com
First off, I used "shc" to convert the code from shell script to C.
And The... (6 Replies)
Discussion started by: ignatius
6 Replies
LEARN ABOUT DEBIAN
svg::graph
Graph(3pm) User Contributed Perl Documentation Graph(3pm)
NAME
SVG::Graph - Visualize your data in Scalable Vector Graphics (SVG) format.
SYNOPSIS
use SVG::Graph;
use SVG::Graph::Data;
use SVG::Graph::Data::Datum;
#create a new SVG document to plot in...
my $graph = SVG::Graph->new(width=>600,height=>600,margin=>30);
#and create a frame to hold the data/glyphs
my $frame = $graph->add_frame;
#let's plot y = x^2
my @data = map {SVG::Graph::Data::Datum->new(x=>$_,y=>$_^2)}
(1,2,3,4,5);
my $data = SVG::Graph::Data->new(data => @data);
#put the xy data into the frame
$frame->add_data($data);
#add some glyphs to apply to the data in the frame
$frame->add_glyph('axis', #add an axis glyph
'x_absolute_ticks' => 1, #with ticks every one
#unit on the x axis
'y_absolute_ticks' => 1, #and ticks every one
#unit on the y axis
'stroke' => 'black', #draw the axis black
'stroke-width' => 2, #and 2px thick
);
$frame->add_glyph('scatter', #add a scatterplot glyph
'stroke' => 'red', #the dots will be outlined
#in red,
'fill' => 'red', #filled red,
'fill-opacity' => 0.5, #and 50% opaque
);
#print the graphic
print $graph->draw;
DESCRIPTION
SVG::Graph is a suite of perl modules for plotting data. SVG::Graph currently supports plots of one-, two- and three-dimensional data, as
well as N-ary rooted trees. Data may be represented as:
Glyph Name Dimensionality supported
1d 2d 3d tree
--------------------------------------------------------
Axis x
Bar Graph x
Bubble Plot x
Heatmap Graph x
Line Graph x
Pie Graph x
Scatter Plot x
Spline Graph x
Tree x
SVG::Graph 0.02 is a pre-alpha release. Keep in mind that many of the glyphs are not very robust.
PLOTTING
You need to create a SVG::Graph::Frame instance from the parent SVG::Graph instance for each set of data to be plotted. Datasets can be
hierarchical, and to represent this, SVG::Graph::Frame instances can themselves contain subframes. SVG::Graph::Frame can contain:
- multiple subframes as instances of SVG::Graph::Frame
- a single SVG::Graph::Data instance
- multiple SVG::Graph::Glyph instances with which to render
the attached SVG::Graph::Data instance, and all SVG::Graph::Data
instances attached to SVG::Graph::Frame subinstances
See SVG::Graph::Frame and SVG::Graph::Glyph for details.
ONE DATA SET
1. create an SVG::Graph instance
2. create an SVG::Graph::Frame instance by calling
SVG::Graph::add_frame();
3. create an SVG::Graph::Data instance, containing
an SVG::Graph::Data::Datum instance for each data point.
4. Attach the SVG::Graph::Data instance to your SVG::Graph::Frame
using SVG::Graph::Frame::add_data();
5. Attach glyphs to the SVG::Graph::Frame instance using
SVG::Graph::Frame::add_glyph();
6. Call SVG::Graph::draw();
MULTIPLE DATA SETS
1. create an SVG::Graph instance
2. create an SVG::Graph::Frame instance by calling
SVG::Graph::add_frame();
3. create an SVG::Graph::Data instance, containing
an SVG::Graph::Data::Datum instance for each data point.
4. Attach the SVG::Graph::Data instance to your SVG::Graph::Frame
using SVG::Graph::Frame::add_data();
5. Attach glyphs to the SVG::Graph::Frame instance using
SVG::Graph::Frame::add_glyph();
6. repeat [2-5] for each additional data set to be added.
add_frame() can be called on SVG::Graph to add top-level data
sets, or SVG::Graph::Frame to add hierarchical data sets.
7. Call SVG::Graph::draw();
FEEDBACK
Send an email to the svg-graph-developers list. For more info, visit the project page at http://www.sf.net/projects/svg-graph
AUTHORS
Allen Day, <allenday@ucla.edu>
Chris To, <crsto@ucla.edu>
CONTRIBUTORS
James Chen, <chenj@seas.ucla.edu>
Brian O'Connor, <boconnor@ucla.edu>
SEE ALSO
SVG
METHODS
new
Title : new
Usage : my $graph = SVG::Graph->new(width=>600,
height=>600,
margin=>20);
Function: creates a new SVG::Graph object
Returns : a SVG::Graph object
Args : width => the width of the SVG
height => the height of the SVG
margin => margin for the root frame
init
Title : init
Usage :
Function:
Example :
Returns :
Args :
width
Title : width
Usage : $obj->width($newval)
Function:
Example :
Returns : value of width (a scalar)
Args : on set, new value (a scalar or undef, optional)
height
Title : height
Usage : $obj->height($newval)
Function:
Example :
Returns : value of height (a scalar)
Args : on set, new value (a scalar or undef, optional)
margin
Title : margin
Usage : $obj->margin($newval)
Function:
Example :
Returns : value of margin (a scalar)
Args : on set, new value (a scalar or undef, optional)
svg
Title : svg
Usage : $obj->svg($newval)
Function:
Example :
Returns : value of svg (a scalar)
Args : on set, new value (a scalar or undef, optional)
add_frame
Title : add_frame
Usage : my $frame = $graph->add_frame
Function: adds a Frame to the current Graph
Returns : a SVG::Graph::Frame object
Args : a hash. usable keys:
frame_transform (optional)
'top' default orientation
'bottom' rotates graph 180 deg (about the center)
'right' points top position towards right
'left' points top position towards left
frames
Title : frames
Usage : get/set
Function:
Example :
Returns :
Args :
xoffset
Title : xoffset
Usage : $obj->xoffset($newval)
Function:
Example :
Returns : value of xoffset (a scalar)
Args : on set, new value (a scalar or undef, optional)
yoffset
Title : yoffset
Usage : $obj->yoffset($newval)
Function:
Example :
Returns : value of yoffset (a scalar)
Args : on set, new value (a scalar or undef, optional)
draw
Title : draw
Usage : $graph=>draw
Function: depends on child glyph implementations
Returns : xmlifyied SVG object
Args : none
perl v5.10.0 2009-01-07 Graph(3pm)