Question: 1. Carefully study the examples provided: fork.c, myls.c, myshell.c, etc. You need to know how they work in order for you to finish this assignment;
1. Carefully study the examples provided: fork.c, myls.c, myshell.c, etc. You need to know how they work in order for you to finish this assignment; the examples will also get you prepared for assignment 3.
2. Write a program called mini shell that creates two child processes: one to execute 'ls -al' and the other to execute grep minishell.c. After the forks, the original parent process waits for both child processes to finish before it terminates. The parent should print out the pid of each child after it finishes. The standard output of 'ls -al' process should be piped to the input to the 'grep minishell.c' process. Make sure you close the unnecessary open files for the three processes. The output should be the one line that includes the directory entry for minishell.c. You will need to call the source file minishell.c for this to work properly.
myls.c code
/*********************************************/
#include
int main() { pid_t pid;
pid = fork(); if(pid < 0) { /* an error occurred */ perror("fork failed"); exit(-1); } else if(pid == 0) { /* child process */ printf("I AM A CHILD PROCESS "); execlp("/bin/ls", "ls", "-l", NULL); /* return only when exec fails */ perror("exec failed"); exit(-1); } else { /* parent process */ wait(0); printf("PARENT PROCESS FOUND CHILD PROCESS COMPLETED "); } return 0; } /*********************************************/
myshell.c code
/*********************************************/
#include
#define MAX_ARGS 20 #define BUFSIZ 1024
int get_args(char* cmdline, char* args[]) { int i = 0;
/* if no args */ if((args[0] = strtok(cmdline, " \t ")) == NULL) return 0;
while((args[++i] = strtok(NULL, " \t ")) != NULL) { if(i >= MAX_ARGS) { printf("Too many arguments! "); exit(1); } } /* the last one is always NULL */ return i; }
void execute(char* cmdline) { int pid, async; char* args[MAX_ARGS];
int nargs = get_args(cmdline, args); if(nargs <= 0) return;
if(!strcmp(args[0], "quit") || !strcmp(args[0], "exit")) { exit(0); }
/* check if async call */ if(!strcmp(args[nargs-1], "&")) { async = 1; args[--nargs] = 0; } else async = 0;
pid = fork(); if(pid == 0) { /* child process */ execvp(args[0], args); /* return only when exec fails */ perror("exec failed"); exit(-1); } else if(pid > 0) { /* parent process */ if(!async) waitpid(pid, NULL, 0); else printf("this is an async call "); } else { /* error occurred */ perror("fork failed"); exit(1); } }
int main (int argc, char* argv []) { char cmdline[BUFSIZ]; for(;;) { printf("COP4338$ "); if(fgets(cmdline, BUFSIZ, stdin) == NULL) { perror("fgets failed"); exit(1); } execute(cmdline) ; } return 0; } /*********************************************/
fork.c code
/*********************************************/
#include
int main() { pid_t pid;
pid = fork(); if(pid < 0) { /* an error occurred */ perror("fork failed"); exit(-1); } else if(pid == 0) { /* child process */ printf("I AM THE CHILD PROCESS... sleeping for 30 seconds "); sleep(30); printf("CHILD FINISHES "); } else { /* parent process */ printf("I AM THE PARENT PROCESS... sleeping for 60 seconds "); sleep(60); printf("PARENT FINISHES "); } return 0; } /*********************************************/
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
