In: Computer Science
UNIX
1. Compile and run shell0.c file
2. Design and implement shell1.c program to handle "exit"
command to terminate the program.
That is, if the user input-string is "exit", then the program
terminates.
3.Design and Implement shell2.c to implement a signal handler to handle ctrl+C (SIGINT) as listed below
void sig_int(int signo) { printf("\nCaught SIGINT!\n"); }
Here is shell0.c file
shell0.c
/*
 *  shell0.c 
 *     running in loop to read input string (command) to be processed
 *     To exit, type EOF (ctlr+D) or ctlr+C 
 */
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
char *getinput(char *buffer, size_t buflen) 
{
        printf("$$ ");
        return fgets(buffer, buflen, stdin);
}
int main(int argc, char **argv) 
{
        char buf[1024];
        pid_t pid;
        int status;
        while (getinput(buf, sizeof(buf))) {
                buf[strlen(buf) - 1] = '\0';
                if((pid=fork()) == -1) {
                        fprintf(stderr, "shell: can't fork: %s\n",
                                        strerror(errno));
                        continue;
                } else if (pid == 0) {
                        /* child */
                        execlp(buf, buf, (char *)0);
                        fprintf(stderr, "shell: couldn't exec %s: %s\n", buf,
                                        strerror(errno));
                        exit(EX_DATAERR);
                }
                if ((pid=waitpid(pid, &status, 0)) < 0)
                        fprintf(stderr, "shell: waitpid error: %s\n",
                                        strerror(errno));
        }
        exit(EX_OK);
}
Here is shell1.c
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
int main(int argc, char **argv)
{
char buf[1024];
  do {
    //write your code here
  }  
  while (strcasecmp(getinput(buf, sizeof(buf)),"exit"));
  return 0;   
}
This will exit the program in unix if user type string exit.
shell2.c
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void sig_int(int signo) { 
if (signo == SIGINT){
   printf("\nCaught SIGINT!\n"); 
}
}
int main(void)
{
  if (signal(SIGINT, sig_int) == SIG_ERR)
  while(1) 
    sleep(1);
  return 0;
}
Here it will stop ctrl+C (SIGINT) from exit and would indiake print Caught SIGINT each time when user presses ctrl+C. We have also used a long wait to issue signal to process.