wait system call

hi there,
i had some trivial questions about this program here. i am kinda confused with these, hope you can help me to understand here. :slight_smile:

#include<stdio.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<unistd.h>

int main(void)
{
int i,status,waitret;

    for\(i=0;i&lt;3;i\+\+\)
    \{
            if\(fork\(\)==0\)
            \{
                    if\(execl\("exec2","exec2",0\)== -1\)
                    \{
                            fprintf\(stderr,"Child: execl failed\\n"\);
                            exit\(1\);
                    \}
            \}

            printf\("Parent: continuing execution after fork %d\\n",i\);
    \}
    /** we see above the parent execution lasted till the closing  
    brace "\}".  now below we call the status function.  what is the 

calling process here? i mean which process gave a call to the function status? is it parent? if it's parent then my question is well we called
for fork inside the for loop and i guess it is supposed to run child and
parent process in the loop only. my confusion builds up in the statement
i am about to write. i read in the text "The wait function suspends the
calling process until one of its immediate child processes terminates. The
termination status of the child process is stored in the integer pointed
to by status. If the calling process does not care about the termination
status, and is only interested in waiting until the child process
terminates, status may be given as the null pointer. If a child process
has terminated prior to the call to wait , wait returns immediately with
the status for that process. The process ID of the process that terminated
is returned by wait; if there are no unwaited-for child processes, wait
returns -1." */

for(i=0;i<3;i++)
{
waitret=wait(&status);
/** wait function is going to return an int value, what is
the purpose of using the function here? what is the calling process here?
what is the termination status of child here? in fork we get the pid of
the child, but what exactly is the termination status? is it gona return
1 on success and 0 on failure if for termination? as seeen above the
child terminates prior to the call of wait, so is wait going to return
the status immediately? what if the wait was called from within the
child process? would that still return immediately? if you read above
it said " The process ID of the process that terminated
is returned by wait". whats the use of it, if we can get the pid of the process by using getpid() or getppid()? /
printf("Status from wait: %d (decimal), %x
(hex)\n",status,status);
}
/
* another question: i thought the parent ended after the for loop was
over, we called for fork within that loop, so isn't the parent restricted
to live inside the opening and closing braces only!? */
printf("Parent: Ending\n");
}

Appreciate your answer.
Cheers!

getpid() will return your pid.
getppid() will return your parent's pid.

There is no such thing as a getcpid() to return your child's pid. How could there be? You might have many children. The value returned by wait() is the pid the the particular child that died. There is no other way to get that pid besides one of the wait calls.

The termination status is generally the parameter to exit(). The child does a exit(2), you get a termination status of 2. It can also be a funky value if the process dies because of the default action of a signal.

The parent runs until it hits an exits, or it returns from main(), or it dies as a result of the default action of a signal.

perderabo
yeah what u said makes sense:D . i appreciate your answer. My main questions were about the reason to use wait and does parent continue execution after the loop and your answers were informative :cool:
Have a good one:)
A25khan