Understanding the Wait System Call in C Programming
The wait system call in C programming is used to block the calling process until one of its child processes exits or a signal is received. This practical guide provides detailed explanations and C program examples to demonstrate the working of the wait system call, including handling child processes, parent-child communication, and process termination. Explore the concepts and practical implementation of the wait system call in C programming.
Download Presentation
Please find below an Image/Link to download the presentation.
The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.
E N D
Presentation Transcript
Wait System Call Practical No 3
Wait System Call in C A call to wait() blocks the calling process until one of its child processes exits or a signal is received. After child process terminates, parent continues its execution after wait system call instruction. Child process may terminate due to any of these: It calls exit(); It returns (an int) from main It receives a signal (from the OS or another process) whose default action is to terminate.
C program to demonstrate working of wait() #include<stdio.h> #include<stdlib.h> #include<sys/wait.h> #include<unistd.h> int main() { pid_t cpid; if (fork()== 0) exit(0); /* terminate child */ else cpid = wait(NULL); /* reaping parent */ printf("Parent pid = %d\n", getpid()); printf("Child pid = %d\n", cpid); return 0; }
Another C program to demonstrate working of wait() #include<stdio.h> #include<sys/wait.h> #include<unistd.h> int main() { if (fork()== 0) printf("HC: hello from child\n"); else { printf("HP: hello from parent\n"); wait(NULL); printf("CT: child has terminated\n"); } printf("Bye\n"); return 0; }
waitpid-example.c if (pid == 0) { int i; for (i = 3; i > 0; i--) { printf("This is the child\n"); sleep(1); } exit(3); } else { int stat_val; waitpid(pid, &stat_val, 0); //waitpid(pid, &stat_val); printf("exit code: %d, signal: %d, raw stat_val: 0x%x %d"); } return 0; } #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(void) { pid_t pid; pid = fork(); if (pid < 0) { perror("fork failed"); exit(1); }
printf("Child: %d: I'm the child\n", pid, c_pid); printf("Child: sleeping for 2-seconds, then exiting with status 12\n"); *get_exitstatus.c*/ #include <unistd.h> #include <stdio.h> #include <stdlib.h> //sleep for 2 seconds sleep(2); //exit with statys 12 exit(12); }else if (c_pid > 0){ //parent //waiting for child to terminate pid = wait(&status); #include <sys/types.h> #include <sys/wait.h> int main(){ if ( WIFEXITED(status) ){ printf("Parent: Child exited with status: %d\n", WEXITSTATUS(status)); } pid_t c_pid, pid; int status; }else{ //error: The return of fork() is negative perror("fork failed"); _exit(2); //exit failure, hard } c_pid = fork(); //duplicate if( c_pid == 0 ){ //child pid = getpid(); return 0; //success }