Program 3 – CS 344OverviewIn this assignment you will write your own shell in C, similar to bash. No other languages, including C++, areallowed, though you may use any version of C you like, such as C99. The shell will run command lineinstructions and return the results similar to other shells you have used, but without many of their fancierfeatures.In this assignment you will write your own shell, called smallsh. This will work like the bash shell you areused to using, prompting for a command line and running commands, but it will not have many of the specialfeatures of the bash shell.Your shell will allow for the redirection of standard input and standard output and it will support bothforeground and background processes (controllable by the command line and by receiving signals).Your shell will support three built in commands: exit , cd , and status . It will also support comments, whichare lines beginning with the # character.During the development of this program, take extra care to only do your work on our class server, as yoursoftware will likely negatively impact whatever machine it runs on, especially before its finished. If you causetrouble on one of the non-class, public servers, it could hurt your grade! If you are having trouble logging into any of our EECS servers because of runaway processes, please use this page to kill off any programsrunning on your account that might be blocking your access:https://teach.engr.oregonstate.edu/teach.php?type=kill_runaway_processes(https://teach.engr.oregonstate.edu/teach.php?type=kill_runaway_processes)SpecicationsThe PromptUse the colon : symbol as a prompt for each command line. Be sure you flush out the output buffers eachtime you print, as the text that youre outputting may not reach the screen until you do in this kind ofinteractive program. To do this, call fflush() immediately after each and every time you output text.The general syntax of a command line is:command [arg1 arg2 ...] [ output_file] [&]2019/11/16 Program 3 - smallshhttps://oregonstate.instructure.com/courses/1738955/assignments/7656345 2/7…where items in square brackets are optional. You can assume that a command is made up of wordsseparated by spaces. The special symbols , and & are recognized, but they must be surrounded byspaces like other words. If the command is to be executed in the background, the last word must be &. If the& character appears anywhere else, just treat it as normal text. If standard input or output is to be redirected,the > or appear before or after output redirection.Your shell does not need to support any quoting; so arguments with spaces inside them are not possible.We are also not implementing the pipe | operator.Your shell must support command lines with a maximum length of 2048 characters, and a maximum of 512arguments. You do not need to do any error checking on the syntax of the command line.Finally, your shell should allow blank lines and comments. Any line that begins with the # character is acomment line and should be ignored (mid-line comments, such as the C-style //, will not be supported). Ablank line (one without any commands) should also do nothing. Your shell should just re-prompt for anothercommand when it receives either a blank line or a comment line.Command ExecutionYou will use fork(), exec(), and waitpid() to execute commands. From a conceptual perspective, considersetting up your shell to run in this manner: let the parent process (your shell) continue running. Whenever anon-built in command is received, have the parent fork() off a child. This child then does any neededinput/output redirection before running exec() on the command given. Note that when doing redirection, thatafter using dup2() to set up the redirection, the redirection symbol and redirection destination/source areNOT passed into the following exec command (i.e., if the command given is ls > junk , then you handle theredirection to junk with dup2() and then simply pass ls into exec() ).Note that exec() will fail, and return the reason why, if it is told to execute something that it cannot do, likerun a program that doesnt exist. In this case, your shell should indicate to the user that a command couldnot be executed (which you know because exec() returned an error), and set the value retrieved by the builtinstatus command to 1. Make sure that the child process that has had an exec() call fail terminates itself,or else it often loops back up to the top and tries to become a parent shell. This is easy to spot: if the outputof the grading script seems to be repeating itself, then youve likely got a child process that didnt terminateafter a failed exec().Your shell should use the PATH variable to look for non-built in commands, and it should allow shell scriptsto be executed. If a command fails because the shell could not find the command to run, then the shell willprint an error message and set the exit status to 1.As above, after the fork() but before the exec() you must do any input and/or output redirection with dup2().An input file redirected via stdin should be opened for reading only; if your shell cannot open the file forreading, it should print an error message and set the exit status to 1 (but dont exit the shell). Similarly, anoutput file redirected via stdout should be opened for writing only; it should be truncated if it already exists orcreated if it does not exist. If your shell cannot open the output file it should print an error message and setthe exit status to 1 (but dont exit the shell).Both stdin and stdout for a command can be redirected at the same time (see example below).Your program must expand any instance of $$ in a command into the process ID of the shell itself. Yourshell does not otherwise perform variable expansion. This feature makes it easier to create a grading script2019/11/16 Program 3 - smallshhttps://oregonstate.instructure.com/courses/1738955/assignments/7656345 3/7that keeps your work separate.Background and ForegroundThe shell should wait() for completion of foreground commands (commands without the &) before promptingfor the next command. If the command given was a foreground command, then the parent shell does NOTreturn command line access and control to the user until the child terminates. It is recommend to have theparent simply call waitpid() on the child, while it waits.The shell will not wait for background commands to complete. If the command given was a backgroundprocess, then the parent returns command line access and control to the user immediately after forking offthe child. In this scenario, your parent shell will need to periodically check for the background childprocesses to complete (with waitpid(...NOHANG...)), so that they can be cleaned up, as the shell continuesto run and process commands. Consider storing the PIDs of non-completed background processes in anarray, so that they can periodically be checked for. Alternatively, you may use a signal handler toimmediately wait() for child processes that terminate, as opposed to periodically checking a list of startedbackground processes. The time to print out when these background processes have completed is justBEFORE command line access and control are returned to the user, every time that happens.Background commands should have their standard input redirected from /dev/null if the user did not specifysome other file to take standard input from. What happens to background commands that read fromstandard input if you forget this? Background commands should also not send their standard output to thescreen: redirect stdout to /dev/null if no other target is given.The shell will print the process id of a background process when it begins. When a background processterminates, a message showing the process id and exit status will be printed. You should check to see if anybackground processes completed just before you prompt for a new command and print this message then.In this way the messages about completed background processes will not appear during other runningcommands, though the user will have to wait until they complete some other command to see thesemessages (this is the way the C shell and Bourne shells work; see example below). You will probablywant to use waitpid() to check for completed background processes.SignalsA CTRL-C command from the keyboard will send a SIGINT signal to your parent shell process and allchildren at the same time (this is a built-in part of Linux). For this assignment, make sure that SIGINT doesnot terminate your shell, but only terminates the foreground command if one is running. To do this, youllhave to create the appropriate signal handlers with sigaction(). The parent should not attempt to terminatethe foreground child process when the parent receives a SIGINT signal: instead, the foreground child (if any)must terminate itself on receipt of this signal.If a child foreground process is killed by a signal, the parent must immediately print out the number of thesignal that killed its foreground child process (see the example) before prompting the user for the nextcommand.Background processes should also not be terminated by a SIGINT signal. They will terminate themselves,continue running, or be terminated when the shell exits (see below).A CTRL-Z command from the keyboard will send a SIGTSTP signal to your parent shell process and allchildren at the same time (this is a built-in part of Linux). When this signal is received byCS 344代做、C++编程调试、C++设计代写、代做com your shell, yourshell must display an informative message (see below) immediately if its sitting at the prompt, or2019/11/16 Program 3 - smallshhttps://oregonstate.instructure.com/courses/1738955/assignments/7656345 4/7immediately after any currently running foreground process has terminated, and then enter a state wheresubsequent commands can no longer be run in the background. In this state, the & operator should simplybe ignored - run all such commands as if they were foreground processes. If the user sends SIGTSTPagain, display another informative message (see below) immediately after any currently running foregroundprocess terminates, and then return back to the normal condition where the & operator is once againhonored for subsequent commands, allowing them to be placed in the background. See the example belowfor usage and the exact syntax which you must use for these two informative messages. Your foregroundand background child processes should all ignore a SIGTSTP signal: only your shell should react to it.Built-in CommandsYour shell will support three built-in commands: exit , cd , and status . You do not have to supportinput/output redirection for these built in commands and they do not have to set any exit status. These threebuilt-in commands are the only ones that your shell will handle itself - all others are simply passed on to amember of the exec() family of functions (which member is up to you) as described above.If the user tries to run one of these built-in commands in the background with the & option, ignore that optionand run it in the foreground anyway (i.e. dont display an error, just run the command in the foreground).The exit command exits your shell. It takes no arguments. When this command is run, your shell must killany other processes or jobs that your shell has started before it terminates itself.The cd command changes the working directory of your shell. By itself - with no arguments - it changes tothe directory specified in the HOME environment variable (not to the location where smallsh was executedfrom, unless your shell executable is located in the HOME directory, in which case these are the same). Thiscommand can also take one argument: the path of a directory to change to. Your cd command shouldsupport both absolute and relative paths. When smallsh terminates, the original shell it was launched fromwill still be in its original working directory, despite your use of chdir() in smallsh. Your shells workingdirectory begins in whatever directory your shells executible was launched from.The status command prints out either the exit status or the terminating signal of the last foreground process(not both, processes killed by signals do not have exit statuses!) ran by your shell. If this command is runbefore any foreground command is run, then it should simply return the exit status 0. These three built-inshell commands do not count as foreground processes for the purposes of this built-in command - i.e.,status should ignore built-in commands.ExampleHere is an example run using smallsh. Note that CTRL-C has no effect towards the bottom of the example,when its used while sitting at the command prompt:$ smallsh: lsjunk smallsh smallsh.c: ls > junk: statusexit value 0: cat junkjunksmallshsmallsh.c: wc junk2: wc 3 3 232019/11/16 Program 3 - smallshhttps://oregonstate.instructure.com/courses/1738955/assignments/7656345 5/7: test -f badfile: statusexit value 1: wc cannot open badfile for input: statusexit value 1: badfilebadfile: no such file or directory: sleep 5^Cterminated by signal 2: status &terminated by signal 2: sleep 15 &background pid is 4923: ps PID TTY TIME CMD 4923 pts/0 00:00:00 sleep 4564 pts/0 00:00:03 bash 4867 pts/0 00:01:32 smallsh 4927 pts/0 00:00:00 ps:: # that was a blank command line, this is a comment line:background pid 4923 is done: exit value 0: # the background sleep finally finished: sleep 30 &background pid is 4941: kill -15 4941background pid 4941 is done: terminated by signal 15: pwd/nfs/stak/faculty/b/brewsteb/CS344/prog3: cd: pwd/nfs/stak/faculty/b/brewsteb: cd CS344: pwd/nfs/stak/faculty/b/brewsteb/CS344: echo 48674867: echo $$4867: ^C^ZEntering foreground-only mode (& is now ignored): date Mon Jan 2 11:24:33 PST 2017: sleep 5 &: date Mon Jan 2 11:24:38 PST 2017: ^ZExiting foreground-only mode: date Mon Jan 2 11:24:39 PST 2017: sleep 5 &background pid is 4963: date Mon Jan 2 11:24:39 PST 2017: exit $Grading Method2019/11/16 Program 3 - smallshhttps://oregonstate.instructure.com/courses/1738955/assignments/7656345 6/7In addition to your shell needing to replicate the above example in functionality, this assignment is providedwith the actual grading test script that will be used to assign your program a grade. Your program mustfunction with this grading script, as follows. To run it, place it in the same directory as your compiled shell,chmod it ( chmod +x ./p3testscript ) and run this command from a bash prompt:$ p3testscript 2>&1or$ p3testscript 2>&1 | moreor$ p3testscript > mytestresults 2>&1Don’t worry if the spacing, indentation, or look of the output of the script is different than when you run itinteractively: that won’t affect your grade. The script may add extra colons at the beginning of lines or doother weird things, like put output about terminating processes further down the script than you intended.Use the script to prepare for your grade, as this is how its being earned.Note that as an extra challenge, no clean run script is provided for Program 3: youll need to interpret theresults of your program yourself.If your program does not work with the grading script, and you instead request that we grade your script byhand, we will have to apply a 50% reduction to your final score. Make sure you work with the grading scripton our class server from the very beginning!HintsIt is recommended that you program the built-in commands first, before tackling the fork(), exec(), waitpid()specifications.Dont forget to use fflush(stdout), as described above!As stated above, make sure you work with the grading script on our class server from the very beginning -dont leave this to the end!Re-EntrancyA topic we havent covered much is the concept of re-entrancy(https://en.wikipedia.org/wiki/Reentrancy_(computing)) . This is important when we consider that signalhandlers cause jumps in execution that cause problems with certain functions.For our purposes, note that the printf() family of functions is NOT re-entrant. In your signal handlers, whenoutputting text, you must use other output functions!Where to ProgramI HIGHLY recommend that you develop this program directly on our course server. Doing so will prevent youfrom having problems transferring the program back and forth, and having compatibility problems. You havebeen warned: it will not behave the same on your own computer!If you do see ^M characters all over your files, try this command:2019/11/16 Program 3 - smallshhttps://oregonstate.instructure.com/courses/1738955/assignments/7656345 7/7$ dos2unix bustedFileWhat to Turn In and WhenPlease submit a single zip file of your program code, which may be in as many different files as you want.Also, inside that zip file, you must provide a file called README that contains instructions on HOW tocompile your code; you may compile your code however you wish. DO NOT include a copy of the testingscript. As our Syllabus says, please be aware that neither the Instructor nor the TA(s) are alerted tocomments added to the text boxes in Canvas that are alongside your assignment submissions, and theymay not be seen. No notifications (email or otherwise) are sent out when these comments are added, so wearent aware that you have added content! If you need to make a meta-comment about this assignment,please include it in the README file in your .zip file, or email the person directly who will be grading it (seethe Home page for grading responsibilities).The graders will compile your code according to your exact specifications. They will make a reasonableeffort to make it work, but if it doesn’t compile, you’ll receive a zero on this assignment.The due date given below is the last minute that this can be turned in for full credit. The available until dateis NOT the due date, but instead closes off submissions for this assignment automatically once 48 hourspast the due date has been reached, in accordance with our Syllabus Grading policies.GradingOnce the program is compiled, according to your specifications given in readme.txt, your shell will beexecuted to run a few sample commands against ( ls , status , exit , in that order). If the program does notsuccessfully work on those commands, it will receive a zero. If it works, it will have the p3testscript programran against it (as detailed above) for final grading. Points will be assigned according to the test script runningon our class server only, so make sure it runs there.170 points are available in the test script, while the final 10 points will be based on your style, readability,and commenting. Comment well, often, and verbosely: we want to see that you are telling us WHY you aredoing things, in addition to telling us WHAT you are doing.The TAs will use this exact set of instructions: Program3 Grading.pdf to grade your submission.转自:http://www.3daixie.com/contents/11/3444.html