SlideShare a Scribd company logo
1 of 14
Download to read offline
Help Needed!
UNIX Shell and History Feature
This project consists of designing a C program to serve as a shell interface
that accepts user commands and then executes each command in a separate
process. This project can be completed on any Linux,
UNIX,orMacOS X system.
A shell interface gives the user a prompt, after which the next command
is entered. The example below illustrates the prompt
osh> and the user’s
next command:
cat prog.c. (This command displays the le prog.c on the
terminal using the
UNIX cat command.)
osh> cat prog.c
One technique for implementing a shell interface is to have the parent process
rst read what the user enters on the command line (in this case,
cat
prog.c), and then create a separate child process that performs the command.
Unless otherwise specied, the parent process waits for the child to exit
before continuing. This is similar in functionality to the new process creation
illustrated in Figure 3.10. However,
UNIX shells typically also allow the child
process to run in the background, or concurrently. To accomplish this, we add
an ampersand (&) at the end of the command. Thus, if we rewrite the above
command as
osh> cat prog.c &
the parent and child processes will run concurrently.
The separate child process is created using the
fork() system call, and the
user’s command is executed using one of the system calls in the
exec() family
A C program that provides the general operations of a command-line shell
is supplied in Figure 3.36. The
main() function presents the prompt osh->
and outlines the steps to be taken after input from the user has been read. The
main() function continually loops as long as should run equals 1; when the
user enters
exit at the prompt, your program will set should run to 0 and
terminate.
This project is organized into two parts: (1) creating the child process and
executing the command in the child, and (2) modifying the shell to allow a
history feature.
#include
#include
#define MAXLINE 80 /* The maximum length command */
int main(void)
{
char *args[MAXLINE/2 + 1]; /* command line arguments */
int should
run = 1; /* flag to determine when to exit program */
while (should run) {
printf("osh>");
}
fflush(stdout);
/**
* After reading user input, the steps are:
* (1) fork a child process using fork()
* (2) the child process will invoke execvp()
* (3) if command included &, parent will invoke wait()
*/
return 0;
}
Part I — Creating a Child Process
The rst task is to modify the
main() function in the above program so that a child
process is forked and executes the command specied by the user. This will
require parsing what the user has entered into separate tokens and storing the
tokens in an array of character strings (
args in the above program. For example, if the
user enters the command
ps -ael at the osh> prompt, the values stored in the
args array are:
args[0] = "ps"
args[1] = "-ael"
args[2] = NULL
This args array will be passed to the execvp() function, which has the
following prototype:
execvp(char *command, char *params[]);
Here, command represents the command to be performed and params stores the
parameters to this command. For this project, the
execvp() function should be invoked as
execvp(args[0], args). Be sure to check whether the user
included an & to determine whether or not the parent process is to wait for the
child to exit.
Part II —Creating a History Feature
The next task is to modify the shell interface program so that it provides
a history feature that allows the user to access the most recently entered
commands. The user will be able to access up to 10 commands by using the
feature. The commands will be consecutively numbered starting at 1, and
the numbering will continue past 10. For example, if the user has entered 35
commands, the 10 most recent commands will be numbered 26 to 35.
The user will be able to list the command history by entering the command
history
at the osh> prompt. As an example, assume that the history consists of the
commands (from most to least recent):
ps, ls -l, top, cal, who, date
The command history will output:
6ps
5ls-l
4 top
3 cal
2 who
1 date
Your program should support two techniques for retrieving commands
from the command history:
1. When the user enters
!!, the most recent command in the history is
executed.
2. When the user enters a single
! followed by an integer N,the Nth
command in the history is executed.
Continuing our example from above, if the user enters !!,the ps command
will be performed; if the user enters !3, the command cal will be executed.
Any command executed in this fashion should be echoed on the user’s screen.
The command should also be placed in the history buffer as the next command.
The program should also manage basic error handling. If there are
no commands in the history, entering !! should result in a message “No commands in history.
” If there is no command corresponding to the number
entered with the single !, the program should output "No such command in
history.
Solution
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CMD_HISTORY_SIZE 10
static char * cmd_history[CMD_HISTORY_SIZE];
static int cmd_history_count = 0;
static void exec_cmd(const char * line)
{
char * CMD = strdup(line);
char *params[10];
int argc = 0;
params[argc++] = strtok(CMD, " ");
while(params[argc-1] != NULL){
params[argc++] = strtok(NULL, " ");
}
argc--;
int background = 0;
if(strcmp(params[argc-1], "&") == 0){
background = 1;
params[--argc] = NULL;
}
int fd[2] = {-1, -1};
while(argc >= 3){
if(strcmp(params[argc-2], ">") == 0){
fd[1] = open(params[argc-1], O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR |
S_IWUSR | S_IRGRP|S_IWGRP);
if(fd[1] == -1){
perror("open");
free(CMD);
return;
}
params[argc-2] = NULL;
argc -= 2;
}else if(strcmp(params[argc-2], "<") == 0){ // input
fd[0] = open(params[argc-1], O_RDONLY);
if(fd[0] == -1){
perror("open");
free(CMD);
return;
}
params[argc-2] = NULL;
argc -= 2;
}else{
break;
}
}
int status;
pid_t pid = fork();
switch(pid){
case -1:
perror("fork");
break;
case 0: // child
if(fd[0] != -1){
if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO){
perror("dup2");
exit(1);
}
}
if(fd[1] != -1){
if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO){
perror("dup2");
exit(1);
}
}
execvp(params[0], params);
perror("execvp");
exit(0);
default: // parent
close(fd[0]);close(fd[1]);
if(!background)
waitpid(pid, &status, 0);
break;
}
free(CMD);
}
static void add_to_history(const char * cmd){
if(cmd_history_count == (CMD_HISTORY_SIZE-1)){
int i;
free(cmd_history[0]);
for(i=1; i < cmd_history_count; i++)
cmd_history[i-1] = cmd_history[i];
cmd_history_count--;
}
cmd_history[cmd_history_count++] = strdup(cmd);
}
static void run_from_history(const char * cmd){
int index = 0;
if(cmd_history_count == 0){
printf("No commands in history ");
return ;
}
if(cmd[1] == '!')
index = cmd_history_count-1;
else{
index = atoi(&cmd[1]) - 1;
if((index < 0) || (index > cmd_history_count)){
fprintf(stderr, "No such command in history. ");
return;
}
}
printf("%s ", cmd);
exec_cmd(cmd_history[index]);
}
static void list_history(){
int i;
for(i=cmd_history_count-1; i >=0 ; i--){
printf("%i %s ", i+1, cmd_history[i]);
}
}
static void signal_handler(const int rc){
switch(rc){
case SIGTERM:
case SIGINT:
break;
case SIGCHLD:
while (waitpid(-1, NULL, WNOHANG) > 0);
break;
}
}
int main(int argc, char *argv[]){
// sinyalleri yakala
struct sigaction act, act_old;
act.sa_handler = signal_handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
if( (sigaction(SIGINT, &act, &act_old) == -1) ||
(sigaction(SIGCHLD, &act, &act_old) == -1)){
perror("signal");
return 1;
}
size_t line_size = 100;
char * line = (char*) malloc(sizeof(char)*line_size);
if(line == NULL){
perror("malloc");
return 1;
}
int inter = 0;
while(1){
if(!inter)
printf("mysh > ");
if(getline(&line, &line_size, stdin) == -1){
if(errno == EINTR){
clearerr(stdin);
inter = 1;
continue;
}
perror("getline");
break;
}
inter = 0;
int line_len = strlen(line);
if(line_len == 1){
continue;
}
line[line_len-1] = '0';
if(strcmp(line, "exit") == 0){
break;
}else if(strcmp(line, "history") == 0){
list_history();
}else if(line[0] == '!'){
run_from_history(line);
}else{
add_to_history(line);
exec_cmd(line);
}
}
free(line);
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CMD_HISTORY_SIZE 10
static char * cmd_history[CMD_HISTORY_SIZE];
static int cmd_history_count = 0;
static void exec_cmd(const char * line)
{
char * CMD = strdup(line);
char *params[10];
int argc = 0;
params[argc++] = strtok(CMD, " ");
while(params[argc-1] != NULL){
params[argc++] = strtok(NULL, " ");
}
argc--;
int background = 0;
if(strcmp(params[argc-1], "&") == 0){
background = 1;
params[--argc] = NULL;
}
int fd[2] = {-1, -1};
while(argc >= 3){
if(strcmp(params[argc-2], ">") == 0){
fd[1] = open(params[argc-1], O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR |
S_IWUSR | S_IRGRP|S_IWGRP);
if(fd[1] == -1){
perror("open");
free(CMD);
return;
}
params[argc-2] = NULL;
argc -= 2;
}else if(strcmp(params[argc-2], "<") == 0){ // input
fd[0] = open(params[argc-1], O_RDONLY);
if(fd[0] == -1){
perror("open");
free(CMD);
return;
}
params[argc-2] = NULL;
argc -= 2;
}else{
break;
}
}
int status;
pid_t pid = fork();
switch(pid){
case -1:
perror("fork");
break;
case 0: // child
if(fd[0] != -1){
if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO){
perror("dup2");
exit(1);
}
}
if(fd[1] != -1){
if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO){
perror("dup2");
exit(1);
}
}
execvp(params[0], params);
perror("execvp");
exit(0);
default: // parent
close(fd[0]);close(fd[1]);
if(!background)
waitpid(pid, &status, 0);
break;
}
free(CMD);
}
static void add_to_history(const char * cmd){
if(cmd_history_count == (CMD_HISTORY_SIZE-1)){
int i;
free(cmd_history[0]);
for(i=1; i < cmd_history_count; i++)
cmd_history[i-1] = cmd_history[i];
cmd_history_count--;
}
cmd_history[cmd_history_count++] = strdup(cmd);
}
static void run_from_history(const char * cmd){
int index = 0;
if(cmd_history_count == 0){
printf("No commands in history ");
return ;
}
if(cmd[1] == '!')
index = cmd_history_count-1;
else{
index = atoi(&cmd[1]) - 1;
if((index < 0) || (index > cmd_history_count)){
fprintf(stderr, "No such command in history. ");
return;
}
}
printf("%s ", cmd);
exec_cmd(cmd_history[index]);
}
static void list_history(){
int i;
for(i=cmd_history_count-1; i >=0 ; i--){
printf("%i %s ", i+1, cmd_history[i]);
}
}
static void signal_handler(const int rc){
switch(rc){
case SIGTERM:
case SIGINT:
break;
case SIGCHLD:
while (waitpid(-1, NULL, WNOHANG) > 0);
break;
}
}
int main(int argc, char *argv[]){
// sinyalleri yakala
struct sigaction act, act_old;
act.sa_handler = signal_handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
if( (sigaction(SIGINT, &act, &act_old) == -1) ||
(sigaction(SIGCHLD, &act, &act_old) == -1)){
perror("signal");
return 1;
}
size_t line_size = 100;
char * line = (char*) malloc(sizeof(char)*line_size);
if(line == NULL){
perror("malloc");
return 1;
}
int inter = 0;
while(1){
if(!inter)
printf("mysh > ");
if(getline(&line, &line_size, stdin) == -1){
if(errno == EINTR){
clearerr(stdin);
inter = 1;
continue;
}
perror("getline");
break;
}
inter = 0;
int line_len = strlen(line);
if(line_len == 1){
continue;
}
line[line_len-1] = '0';
if(strcmp(line, "exit") == 0){
break;
}else if(strcmp(line, "history") == 0){
list_history();
}else if(line[0] == '!'){
run_from_history(line);
}else{
add_to_history(line);
exec_cmd(line);
}
}
free(line);
return 0;
}

More Related Content

Similar to Help Needed!UNIX Shell and History Feature This project consists.pdf

Lab report 201001067_201001104
Lab report 201001067_201001104Lab report 201001067_201001104
Lab report 201001067_201001104swena_gupta
 
C Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointC Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointJavaTpoint.Com
 
Introduction to MPI
Introduction to MPIIntroduction to MPI
Introduction to MPIyaman dua
 
Parallel Programming With Dot Net
Parallel Programming With Dot NetParallel Programming With Dot Net
Parallel Programming With Dot NetNeeraj Kaushik
 
Beyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisBeyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisFastly
 
The ProblemUsing C programming language write a program that simul.pdf
The ProblemUsing C programming language write a program that simul.pdfThe ProblemUsing C programming language write a program that simul.pdf
The ProblemUsing C programming language write a program that simul.pdffederaleyecare
 
Processes And Job Control
Processes And Job ControlProcesses And Job Control
Processes And Job Controlahmad bassiouny
 
Buffer overflow tutorial
Buffer overflow tutorialBuffer overflow tutorial
Buffer overflow tutorialhughpearse
 
Mouse programming in c
Mouse programming in cMouse programming in c
Mouse programming in cgkgaur1987
 
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsSystem Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsashukiller7
 
System programmin practical file
System programmin practical fileSystem programmin practical file
System programmin practical fileAnkit Dixit
 
Programming ppt files (final)
Programming ppt files (final)Programming ppt files (final)
Programming ppt files (final)yap_raiza
 
Pascal script maxbox_ekon_14_2
Pascal script maxbox_ekon_14_2Pascal script maxbox_ekon_14_2
Pascal script maxbox_ekon_14_2Max Kleiner
 
Router Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditionsRouter Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditionsMorteza Mahdilar
 

Similar to Help Needed!UNIX Shell and History Feature This project consists.pdf (20)

Lab report 201001067_201001104
Lab report 201001067_201001104Lab report 201001067_201001104
Lab report 201001067_201001104
 
Activity 5
Activity 5Activity 5
Activity 5
 
C Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointC Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpoint
 
Introduction to MPI
Introduction to MPIIntroduction to MPI
Introduction to MPI
 
Parallel Programming With Dot Net
Parallel Programming With Dot NetParallel Programming With Dot Net
Parallel Programming With Dot Net
 
Beyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisBeyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic Analysis
 
The ProblemUsing C programming language write a program that simul.pdf
The ProblemUsing C programming language write a program that simul.pdfThe ProblemUsing C programming language write a program that simul.pdf
The ProblemUsing C programming language write a program that simul.pdf
 
Os lab final
Os lab finalOs lab final
Os lab final
 
Processes And Job Control
Processes And Job ControlProcesses And Job Control
Processes And Job Control
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
CGI.ppt
CGI.pptCGI.ppt
CGI.ppt
 
Buffer overflow tutorial
Buffer overflow tutorialBuffer overflow tutorial
Buffer overflow tutorial
 
Mouse programming in c
Mouse programming in cMouse programming in c
Mouse programming in c
 
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsSystem Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
 
System programmin practical file
System programmin practical fileSystem programmin practical file
System programmin practical file
 
Golang dot-testing-lite
Golang dot-testing-liteGolang dot-testing-lite
Golang dot-testing-lite
 
Usp
UspUsp
Usp
 
Programming ppt files (final)
Programming ppt files (final)Programming ppt files (final)
Programming ppt files (final)
 
Pascal script maxbox_ekon_14_2
Pascal script maxbox_ekon_14_2Pascal script maxbox_ekon_14_2
Pascal script maxbox_ekon_14_2
 
Router Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditionsRouter Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditions
 

More from mohdjakirfb

Describe the stages of malaria and the site of protozoal activity on.pdf
Describe the stages of malaria and the site of protozoal activity on.pdfDescribe the stages of malaria and the site of protozoal activity on.pdf
Describe the stages of malaria and the site of protozoal activity on.pdfmohdjakirfb
 
Database problem. Design a realtional schema based on E-R Diagram. B.pdf
Database problem. Design a realtional schema based on E-R Diagram. B.pdfDatabase problem. Design a realtional schema based on E-R Diagram. B.pdf
Database problem. Design a realtional schema based on E-R Diagram. B.pdfmohdjakirfb
 
d. What types of information systems ru currently utilized at PVF Pr.pdf
d. What types of information systems ru currently utilized at PVF Pr.pdfd. What types of information systems ru currently utilized at PVF Pr.pdf
d. What types of information systems ru currently utilized at PVF Pr.pdfmohdjakirfb
 
Bacteria growthExplain a growth curve.Explain lag phase, exponen.pdf
Bacteria growthExplain a growth curve.Explain lag phase, exponen.pdfBacteria growthExplain a growth curve.Explain lag phase, exponen.pdf
Bacteria growthExplain a growth curve.Explain lag phase, exponen.pdfmohdjakirfb
 
An ovum has all the nutrients stored that required for embryonic d.pdf
An ovum has all the nutrients stored that required for embryonic d.pdfAn ovum has all the nutrients stored that required for embryonic d.pdf
An ovum has all the nutrients stored that required for embryonic d.pdfmohdjakirfb
 
A plant with either the PP or Pp genotype has purple flowers, while .pdf
A plant with either the PP or Pp genotype has purple flowers, while .pdfA plant with either the PP or Pp genotype has purple flowers, while .pdf
A plant with either the PP or Pp genotype has purple flowers, while .pdfmohdjakirfb
 
________ ANOVA relies on matched samples in a similar way to the mat.pdf
________ ANOVA relies on matched samples in a similar way to the mat.pdf________ ANOVA relies on matched samples in a similar way to the mat.pdf
________ ANOVA relies on matched samples in a similar way to the mat.pdfmohdjakirfb
 
Write a program that converts an infix expression into an equivalent.pdf
Write a program that converts an infix expression into an equivalent.pdfWrite a program that converts an infix expression into an equivalent.pdf
Write a program that converts an infix expression into an equivalent.pdfmohdjakirfb
 
Write a Java program that mimics the framework for an online movie i.pdf
Write a Java program that mimics the framework for an online movie i.pdfWrite a Java program that mimics the framework for an online movie i.pdf
Write a Java program that mimics the framework for an online movie i.pdfmohdjakirfb
 
Which microtubule (MT) population binds to chromosomes during mitosi.pdf
Which microtubule (MT) population binds to chromosomes during mitosi.pdfWhich microtubule (MT) population binds to chromosomes during mitosi.pdf
Which microtubule (MT) population binds to chromosomes during mitosi.pdfmohdjakirfb
 
React to the following statement Knowledge is the technology wh.pdf
React to the following statement Knowledge is the technology wh.pdfReact to the following statement Knowledge is the technology wh.pdf
React to the following statement Knowledge is the technology wh.pdfmohdjakirfb
 
what animals first evolved true skeletonswhat animals first .pdf
what animals first evolved true skeletonswhat animals first .pdfwhat animals first evolved true skeletonswhat animals first .pdf
what animals first evolved true skeletonswhat animals first .pdfmohdjakirfb
 
true or false Different parts of the genome evolve at different spe.pdf
true or false Different parts of the genome evolve at different spe.pdftrue or false Different parts of the genome evolve at different spe.pdf
true or false Different parts of the genome evolve at different spe.pdfmohdjakirfb
 
The brightness in the center of a Fresnel diffraction pattern. Is al.pdf
The brightness in the center of a Fresnel diffraction pattern.  Is al.pdfThe brightness in the center of a Fresnel diffraction pattern.  Is al.pdf
The brightness in the center of a Fresnel diffraction pattern. Is al.pdfmohdjakirfb
 
Should Linda’s history of past improprieties lead Maria to withdraw .pdf
Should Linda’s history of past improprieties lead Maria to withdraw .pdfShould Linda’s history of past improprieties lead Maria to withdraw .pdf
Should Linda’s history of past improprieties lead Maria to withdraw .pdfmohdjakirfb
 
Problem 4.Organisms are present in ballast water discharged from a.pdf
Problem 4.Organisms are present in ballast water discharged from a.pdfProblem 4.Organisms are present in ballast water discharged from a.pdf
Problem 4.Organisms are present in ballast water discharged from a.pdfmohdjakirfb
 
Q2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdf
Q2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdfQ2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdf
Q2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdfmohdjakirfb
 
QUESTION 6- Delay spread of optical pulses results on multimode fibe.pdf
QUESTION 6- Delay spread of optical pulses results on multimode fibe.pdfQUESTION 6- Delay spread of optical pulses results on multimode fibe.pdf
QUESTION 6- Delay spread of optical pulses results on multimode fibe.pdfmohdjakirfb
 
31.A Biased sample is one that ______a. Is too smallb. Will al.pdf
31.A Biased sample is one that ______a. Is too smallb. Will al.pdf31.A Biased sample is one that ______a. Is too smallb. Will al.pdf
31.A Biased sample is one that ______a. Is too smallb. Will al.pdfmohdjakirfb
 
Please help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdf
Please help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdfPlease help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdf
Please help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdfmohdjakirfb
 

More from mohdjakirfb (20)

Describe the stages of malaria and the site of protozoal activity on.pdf
Describe the stages of malaria and the site of protozoal activity on.pdfDescribe the stages of malaria and the site of protozoal activity on.pdf
Describe the stages of malaria and the site of protozoal activity on.pdf
 
Database problem. Design a realtional schema based on E-R Diagram. B.pdf
Database problem. Design a realtional schema based on E-R Diagram. B.pdfDatabase problem. Design a realtional schema based on E-R Diagram. B.pdf
Database problem. Design a realtional schema based on E-R Diagram. B.pdf
 
d. What types of information systems ru currently utilized at PVF Pr.pdf
d. What types of information systems ru currently utilized at PVF Pr.pdfd. What types of information systems ru currently utilized at PVF Pr.pdf
d. What types of information systems ru currently utilized at PVF Pr.pdf
 
Bacteria growthExplain a growth curve.Explain lag phase, exponen.pdf
Bacteria growthExplain a growth curve.Explain lag phase, exponen.pdfBacteria growthExplain a growth curve.Explain lag phase, exponen.pdf
Bacteria growthExplain a growth curve.Explain lag phase, exponen.pdf
 
An ovum has all the nutrients stored that required for embryonic d.pdf
An ovum has all the nutrients stored that required for embryonic d.pdfAn ovum has all the nutrients stored that required for embryonic d.pdf
An ovum has all the nutrients stored that required for embryonic d.pdf
 
A plant with either the PP or Pp genotype has purple flowers, while .pdf
A plant with either the PP or Pp genotype has purple flowers, while .pdfA plant with either the PP or Pp genotype has purple flowers, while .pdf
A plant with either the PP or Pp genotype has purple flowers, while .pdf
 
________ ANOVA relies on matched samples in a similar way to the mat.pdf
________ ANOVA relies on matched samples in a similar way to the mat.pdf________ ANOVA relies on matched samples in a similar way to the mat.pdf
________ ANOVA relies on matched samples in a similar way to the mat.pdf
 
Write a program that converts an infix expression into an equivalent.pdf
Write a program that converts an infix expression into an equivalent.pdfWrite a program that converts an infix expression into an equivalent.pdf
Write a program that converts an infix expression into an equivalent.pdf
 
Write a Java program that mimics the framework for an online movie i.pdf
Write a Java program that mimics the framework for an online movie i.pdfWrite a Java program that mimics the framework for an online movie i.pdf
Write a Java program that mimics the framework for an online movie i.pdf
 
Which microtubule (MT) population binds to chromosomes during mitosi.pdf
Which microtubule (MT) population binds to chromosomes during mitosi.pdfWhich microtubule (MT) population binds to chromosomes during mitosi.pdf
Which microtubule (MT) population binds to chromosomes during mitosi.pdf
 
React to the following statement Knowledge is the technology wh.pdf
React to the following statement Knowledge is the technology wh.pdfReact to the following statement Knowledge is the technology wh.pdf
React to the following statement Knowledge is the technology wh.pdf
 
what animals first evolved true skeletonswhat animals first .pdf
what animals first evolved true skeletonswhat animals first .pdfwhat animals first evolved true skeletonswhat animals first .pdf
what animals first evolved true skeletonswhat animals first .pdf
 
true or false Different parts of the genome evolve at different spe.pdf
true or false Different parts of the genome evolve at different spe.pdftrue or false Different parts of the genome evolve at different spe.pdf
true or false Different parts of the genome evolve at different spe.pdf
 
The brightness in the center of a Fresnel diffraction pattern. Is al.pdf
The brightness in the center of a Fresnel diffraction pattern.  Is al.pdfThe brightness in the center of a Fresnel diffraction pattern.  Is al.pdf
The brightness in the center of a Fresnel diffraction pattern. Is al.pdf
 
Should Linda’s history of past improprieties lead Maria to withdraw .pdf
Should Linda’s history of past improprieties lead Maria to withdraw .pdfShould Linda’s history of past improprieties lead Maria to withdraw .pdf
Should Linda’s history of past improprieties lead Maria to withdraw .pdf
 
Problem 4.Organisms are present in ballast water discharged from a.pdf
Problem 4.Organisms are present in ballast water discharged from a.pdfProblem 4.Organisms are present in ballast water discharged from a.pdf
Problem 4.Organisms are present in ballast water discharged from a.pdf
 
Q2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdf
Q2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdfQ2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdf
Q2. Does Application Engine Generate SQLs like Query ManagerQ7. C.pdf
 
QUESTION 6- Delay spread of optical pulses results on multimode fibe.pdf
QUESTION 6- Delay spread of optical pulses results on multimode fibe.pdfQUESTION 6- Delay spread of optical pulses results on multimode fibe.pdf
QUESTION 6- Delay spread of optical pulses results on multimode fibe.pdf
 
31.A Biased sample is one that ______a. Is too smallb. Will al.pdf
31.A Biased sample is one that ______a. Is too smallb. Will al.pdf31.A Biased sample is one that ______a. Is too smallb. Will al.pdf
31.A Biased sample is one that ______a. Is too smallb. Will al.pdf
 
Please help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdf
Please help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdfPlease help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdf
Please help me Im very confused thanks Find sin 2x, cos 2x, and tan .pdf
 

Recently uploaded

Measures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeMeasures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeThiyagu K
 
Science 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its CharacteristicsScience 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its CharacteristicsKarinaGenton
 
Introduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxIntroduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxpboyjonauth
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAssociation for Project Management
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxheathfieldcps1
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdfssuser54595a
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Krashi Coaching
 
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Celine George
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxSayali Powar
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformChameera Dedduwage
 
Presiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha electionsPresiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha electionsanshu789521
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Sapana Sha
 
Mastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory InspectionMastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory InspectionSafetyChain Software
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxmanuelaromero2013
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
Micromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of PowdersMicromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of PowdersChitralekhaTherkar
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)eniolaolutunde
 

Recently uploaded (20)

Measures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeMeasures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and Mode
 
Science 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its CharacteristicsScience 7 - LAND and SEA BREEZE and its Characteristics
Science 7 - LAND and SEA BREEZE and its Characteristics
 
Introduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxIntroduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptx
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across Sectors
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptx
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
 
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy Reform
 
Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1
 
Presiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha electionsPresiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha elections
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
 
Mastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory InspectionMastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory Inspection
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptx
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
 
Micromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of PowdersMicromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of Powders
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)
 

Help Needed!UNIX Shell and History Feature This project consists.pdf

  • 1. Help Needed! UNIX Shell and History Feature This project consists of designing a C program to serve as a shell interface that accepts user commands and then executes each command in a separate process. This project can be completed on any Linux, UNIX,orMacOS X system. A shell interface gives the user a prompt, after which the next command is entered. The example below illustrates the prompt osh> and the user’s next command: cat prog.c. (This command displays the le prog.c on the terminal using the UNIX cat command.) osh> cat prog.c One technique for implementing a shell interface is to have the parent process rst read what the user enters on the command line (in this case, cat prog.c), and then create a separate child process that performs the command. Unless otherwise specied, the parent process waits for the child to exit before continuing. This is similar in functionality to the new process creation illustrated in Figure 3.10. However, UNIX shells typically also allow the child process to run in the background, or concurrently. To accomplish this, we add an ampersand (&) at the end of the command. Thus, if we rewrite the above command as osh> cat prog.c & the parent and child processes will run concurrently. The separate child process is created using the fork() system call, and the user’s command is executed using one of the system calls in the exec() family A C program that provides the general operations of a command-line shell is supplied in Figure 3.36. The main() function presents the prompt osh->
  • 2. and outlines the steps to be taken after input from the user has been read. The main() function continually loops as long as should run equals 1; when the user enters exit at the prompt, your program will set should run to 0 and terminate. This project is organized into two parts: (1) creating the child process and executing the command in the child, and (2) modifying the shell to allow a history feature. #include #include #define MAXLINE 80 /* The maximum length command */ int main(void) { char *args[MAXLINE/2 + 1]; /* command line arguments */ int should run = 1; /* flag to determine when to exit program */ while (should run) { printf("osh>"); } fflush(stdout); /** * After reading user input, the steps are: * (1) fork a child process using fork() * (2) the child process will invoke execvp() * (3) if command included &, parent will invoke wait() */ return 0; } Part I — Creating a Child Process The rst task is to modify the main() function in the above program so that a child process is forked and executes the command specied by the user. This will require parsing what the user has entered into separate tokens and storing the tokens in an array of character strings ( args in the above program. For example, if the user enters the command
  • 3. ps -ael at the osh> prompt, the values stored in the args array are: args[0] = "ps" args[1] = "-ael" args[2] = NULL This args array will be passed to the execvp() function, which has the following prototype: execvp(char *command, char *params[]); Here, command represents the command to be performed and params stores the parameters to this command. For this project, the execvp() function should be invoked as execvp(args[0], args). Be sure to check whether the user included an & to determine whether or not the parent process is to wait for the child to exit. Part II —Creating a History Feature The next task is to modify the shell interface program so that it provides a history feature that allows the user to access the most recently entered commands. The user will be able to access up to 10 commands by using the feature. The commands will be consecutively numbered starting at 1, and the numbering will continue past 10. For example, if the user has entered 35 commands, the 10 most recent commands will be numbered 26 to 35. The user will be able to list the command history by entering the command history at the osh> prompt. As an example, assume that the history consists of the commands (from most to least recent): ps, ls -l, top, cal, who, date The command history will output: 6ps 5ls-l 4 top 3 cal 2 who 1 date Your program should support two techniques for retrieving commands from the command history: 1. When the user enters
  • 4. !!, the most recent command in the history is executed. 2. When the user enters a single ! followed by an integer N,the Nth command in the history is executed. Continuing our example from above, if the user enters !!,the ps command will be performed; if the user enters !3, the command cal will be executed. Any command executed in this fashion should be echoed on the user’s screen. The command should also be placed in the history buffer as the next command. The program should also manage basic error handling. If there are no commands in the history, entering !! should result in a message “No commands in history. ” If there is no command corresponding to the number entered with the single !, the program should output "No such command in history. Solution #include #include #include #include #include #include #include #include #include #include #include #include #define CMD_HISTORY_SIZE 10 static char * cmd_history[CMD_HISTORY_SIZE]; static int cmd_history_count = 0; static void exec_cmd(const char * line) { char * CMD = strdup(line); char *params[10];
  • 5. int argc = 0; params[argc++] = strtok(CMD, " "); while(params[argc-1] != NULL){ params[argc++] = strtok(NULL, " "); } argc--; int background = 0; if(strcmp(params[argc-1], "&") == 0){ background = 1; params[--argc] = NULL; } int fd[2] = {-1, -1}; while(argc >= 3){ if(strcmp(params[argc-2], ">") == 0){ fd[1] = open(params[argc-1], O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP|S_IWGRP); if(fd[1] == -1){ perror("open"); free(CMD); return; } params[argc-2] = NULL; argc -= 2; }else if(strcmp(params[argc-2], "<") == 0){ // input fd[0] = open(params[argc-1], O_RDONLY); if(fd[0] == -1){ perror("open"); free(CMD); return; } params[argc-2] = NULL; argc -= 2;
  • 6. }else{ break; } } int status; pid_t pid = fork(); switch(pid){ case -1: perror("fork"); break; case 0: // child if(fd[0] != -1){ if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO){ perror("dup2"); exit(1); } } if(fd[1] != -1){ if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO){ perror("dup2"); exit(1); } } execvp(params[0], params); perror("execvp"); exit(0); default: // parent close(fd[0]);close(fd[1]); if(!background) waitpid(pid, &status, 0); break; } free(CMD); } static void add_to_history(const char * cmd){ if(cmd_history_count == (CMD_HISTORY_SIZE-1)){
  • 7. int i; free(cmd_history[0]); for(i=1; i < cmd_history_count; i++) cmd_history[i-1] = cmd_history[i]; cmd_history_count--; } cmd_history[cmd_history_count++] = strdup(cmd); } static void run_from_history(const char * cmd){ int index = 0; if(cmd_history_count == 0){ printf("No commands in history "); return ; } if(cmd[1] == '!') index = cmd_history_count-1; else{ index = atoi(&cmd[1]) - 1; if((index < 0) || (index > cmd_history_count)){ fprintf(stderr, "No such command in history. "); return; } } printf("%s ", cmd); exec_cmd(cmd_history[index]); } static void list_history(){ int i; for(i=cmd_history_count-1; i >=0 ; i--){ printf("%i %s ", i+1, cmd_history[i]); } } static void signal_handler(const int rc){ switch(rc){ case SIGTERM:
  • 8. case SIGINT: break; case SIGCHLD: while (waitpid(-1, NULL, WNOHANG) > 0); break; } } int main(int argc, char *argv[]){ // sinyalleri yakala struct sigaction act, act_old; act.sa_handler = signal_handler; act.sa_flags = 0; sigemptyset(&act.sa_mask); if( (sigaction(SIGINT, &act, &act_old) == -1) || (sigaction(SIGCHLD, &act, &act_old) == -1)){ perror("signal"); return 1; } size_t line_size = 100; char * line = (char*) malloc(sizeof(char)*line_size); if(line == NULL){ perror("malloc"); return 1; } int inter = 0; while(1){ if(!inter) printf("mysh > "); if(getline(&line, &line_size, stdin) == -1){ if(errno == EINTR){ clearerr(stdin); inter = 1;
  • 9. continue; } perror("getline"); break; } inter = 0; int line_len = strlen(line); if(line_len == 1){ continue; } line[line_len-1] = '0'; if(strcmp(line, "exit") == 0){ break; }else if(strcmp(line, "history") == 0){ list_history(); }else if(line[0] == '!'){ run_from_history(line); }else{ add_to_history(line); exec_cmd(line); } } free(line); return 0; } #include #include #include #include #include #include #include #include #include #include
  • 10. #include #include #define CMD_HISTORY_SIZE 10 static char * cmd_history[CMD_HISTORY_SIZE]; static int cmd_history_count = 0; static void exec_cmd(const char * line) { char * CMD = strdup(line); char *params[10]; int argc = 0; params[argc++] = strtok(CMD, " "); while(params[argc-1] != NULL){ params[argc++] = strtok(NULL, " "); } argc--; int background = 0; if(strcmp(params[argc-1], "&") == 0){ background = 1; params[--argc] = NULL; } int fd[2] = {-1, -1}; while(argc >= 3){ if(strcmp(params[argc-2], ">") == 0){ fd[1] = open(params[argc-1], O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP|S_IWGRP); if(fd[1] == -1){ perror("open"); free(CMD); return; } params[argc-2] = NULL; argc -= 2;
  • 11. }else if(strcmp(params[argc-2], "<") == 0){ // input fd[0] = open(params[argc-1], O_RDONLY); if(fd[0] == -1){ perror("open"); free(CMD); return; } params[argc-2] = NULL; argc -= 2; }else{ break; } } int status; pid_t pid = fork(); switch(pid){ case -1: perror("fork"); break; case 0: // child if(fd[0] != -1){ if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO){ perror("dup2"); exit(1); } } if(fd[1] != -1){ if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO){ perror("dup2"); exit(1); } } execvp(params[0], params); perror("execvp"); exit(0); default: // parent
  • 12. close(fd[0]);close(fd[1]); if(!background) waitpid(pid, &status, 0); break; } free(CMD); } static void add_to_history(const char * cmd){ if(cmd_history_count == (CMD_HISTORY_SIZE-1)){ int i; free(cmd_history[0]); for(i=1; i < cmd_history_count; i++) cmd_history[i-1] = cmd_history[i]; cmd_history_count--; } cmd_history[cmd_history_count++] = strdup(cmd); } static void run_from_history(const char * cmd){ int index = 0; if(cmd_history_count == 0){ printf("No commands in history "); return ; } if(cmd[1] == '!') index = cmd_history_count-1; else{ index = atoi(&cmd[1]) - 1; if((index < 0) || (index > cmd_history_count)){ fprintf(stderr, "No such command in history. "); return; } } printf("%s ", cmd); exec_cmd(cmd_history[index]); }
  • 13. static void list_history(){ int i; for(i=cmd_history_count-1; i >=0 ; i--){ printf("%i %s ", i+1, cmd_history[i]); } } static void signal_handler(const int rc){ switch(rc){ case SIGTERM: case SIGINT: break; case SIGCHLD: while (waitpid(-1, NULL, WNOHANG) > 0); break; } } int main(int argc, char *argv[]){ // sinyalleri yakala struct sigaction act, act_old; act.sa_handler = signal_handler; act.sa_flags = 0; sigemptyset(&act.sa_mask); if( (sigaction(SIGINT, &act, &act_old) == -1) || (sigaction(SIGCHLD, &act, &act_old) == -1)){ perror("signal"); return 1; } size_t line_size = 100; char * line = (char*) malloc(sizeof(char)*line_size); if(line == NULL){ perror("malloc"); return 1;
  • 14. } int inter = 0; while(1){ if(!inter) printf("mysh > "); if(getline(&line, &line_size, stdin) == -1){ if(errno == EINTR){ clearerr(stdin); inter = 1; continue; } perror("getline"); break; } inter = 0; int line_len = strlen(line); if(line_len == 1){ continue; } line[line_len-1] = '0'; if(strcmp(line, "exit") == 0){ break; }else if(strcmp(line, "history") == 0){ list_history(); }else if(line[0] == '!'){ run_from_history(line); }else{ add_to_history(line); exec_cmd(line); } } free(line); return 0; }