#include <stdio.h>
#include <unistd.h> // for fork(), execlp(), getpid()
#include <sys/types.h> // for pid_t
#include <sys/wait.h> // for wait()
#include <stdlib.h> // for exit()
#define MAX_COUNT 5
// Function declarations
void parentProcess( ) ;
void childProcess( ) ;
int main( )
{
pid_t pid;
// Create child process
pid = fork( ) ;
// If fork fails
if ( pid < 0 )
{
printf ( "Fork failed\n " ) ;
return 1 ;
}
// Child process
if ( pid == 0 )
{
childProcess( ) ;
}
// Parent process
else
{
parentProcess( ) ;
}
return 0 ;
}
// Child Process Function
void childProcess( )
{
printf ( "Output of execlp system call:\n " ) ;
// Executes 'ls' command
execlp( "/bin/ls" , "ls" , NULL ) ;
// This line runs only if execlp fails
printf ( "execlp failed\n " ) ;
}
// Parent Process Function
void parentProcess( )
{
int i;
pid_t processID;
// Wait for child process to complete
wait( NULL ) ;
// Get parent process ID
processID = getpid( ) ;
// Print lines from parent
for ( i = 1 ; i <= MAX_COUNT; i++ )
{
printf ( "Line from parent process = %d\n " , i) ;
}
printf ( "Parent process is done\n " ) ;
printf ( "Parent Process ID = %d\n " , processID) ;
exit ( 0 ) ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4gICAgIC8vIGZvciBmb3JrKCksIGV4ZWNscCgpLCBnZXRwaWQoKQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBmb3IgcGlkX3QKI2luY2x1ZGUgPHN5cy93YWl0Lmg+ICAgLy8gZm9yIHdhaXQoKQojaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvLyBmb3IgZXhpdCgpCgojZGVmaW5lIE1BWF9DT1VOVCA1CgovLyBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKdm9pZCBwYXJlbnRQcm9jZXNzKCk7CnZvaWQgY2hpbGRQcm9jZXNzKCk7CgppbnQgbWFpbigpCnsKICAgIHBpZF90IHBpZDsKCiAgICAvLyBDcmVhdGUgY2hpbGQgcHJvY2VzcwogICAgcGlkID0gZm9yaygpOwoKICAgIC8vIElmIGZvcmsgZmFpbHMKICAgIGlmIChwaWQgPCAwKQogICAgewogICAgICAgIHByaW50ZigiRm9yayBmYWlsZWRcbiIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIENoaWxkIHByb2Nlc3MKICAgIGlmIChwaWQgPT0gMCkKICAgIHsKICAgICAgICBjaGlsZFByb2Nlc3MoKTsKICAgIH0KICAgIC8vIFBhcmVudCBwcm9jZXNzCiAgICBlbHNlCiAgICB7CiAgICAgICAgcGFyZW50UHJvY2VzcygpOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovLyBDaGlsZCBQcm9jZXNzIEZ1bmN0aW9uCnZvaWQgY2hpbGRQcm9jZXNzKCkKewogICAgcHJpbnRmKCJPdXRwdXQgb2YgZXhlY2xwIHN5c3RlbSBjYWxsOlxuIik7CgogICAgLy8gRXhlY3V0ZXMgJ2xzJyBjb21tYW5kCiAgICBleGVjbHAoIi9iaW4vbHMiLCAibHMiLCBOVUxMKTsKCiAgICAvLyBUaGlzIGxpbmUgcnVucyBvbmx5IGlmIGV4ZWNscCBmYWlscwogICAgcHJpbnRmKCJleGVjbHAgZmFpbGVkXG4iKTsKfQoKLy8gUGFyZW50IFByb2Nlc3MgRnVuY3Rpb24Kdm9pZCBwYXJlbnRQcm9jZXNzKCkKewogICAgaW50IGk7CiAgICBwaWRfdCBwcm9jZXNzSUQ7CgogICAgLy8gV2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byBjb21wbGV0ZQogICAgd2FpdChOVUxMKTsKCiAgICAvLyBHZXQgcGFyZW50IHByb2Nlc3MgSUQKICAgIHByb2Nlc3NJRCA9IGdldHBpZCgpOwoKICAgIC8vIFByaW50IGxpbmVzIGZyb20gcGFyZW50CiAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9DT1VOVDsgaSsrKQogICAgewogICAgICAgIHByaW50ZigiTGluZSBmcm9tIHBhcmVudCBwcm9jZXNzID0gJWRcbiIsIGkpOwogICAgfQoKICAgIHByaW50ZigiUGFyZW50IHByb2Nlc3MgaXMgZG9uZVxuIik7CiAgICBwcmludGYoIlBhcmVudCBQcm9jZXNzIElEID0gJWRcbiIsIHByb2Nlc3NJRCk7CgogICAgZXhpdCgwKTsKfQ==