OperatingSystem代写:CSE320SFISHShellPart3


代写一个类似Shell功能的命令行工具,第三部分是I/O的重定向,包括管道操作,也就是 <>| 这三个符号。

Part III: Output Redirection

One of the most powerful features of a Unix-like shell is the ability to
compose a series of simple applications to create a complex workflow. The key
feature that enables this composition is output redirection.
Redirection is accomplished by three special characters < , > , and | . You will need to add logic to your parsing code that identifies these
characters and uses them to identify shell-level directives, rather than
simply passing them to exec.
The first two characters, < and > , can direct input from a file into
a program and output from a program respectively.
sfish > ls - l > newfile
sfish > grep .c < newfile
# Output from ls -l
sfish > echo “Hello, World!” > file
sfish > cat file
Hello, World!
sfish>
In the example above, the standard output of ls -l is redirected to a file
named newfile. If newfile didn’t exist before the command was executed, the
shell created it. If newfile did exist before the command was executed, the
shell overwrote it.
The example above also shows the input redirection of grep using < .
The standard input of grep is set to the file newfile rather than input
from the terminal.

The ls program does not know it is writing to a file and is not passed
the string > newfile as an argument. Instead, the shell redirects stdout
of ls to the file. Similarly, in the second command, the contents of
newfile are passed to the grep program as its standard input ( stdin ).
You are not constrained to using just standard input (handle 0) and standard
output (handle 1) with these operators. You should be able to put 2 in front
of the > operator to redirect output of stderr to a file.
sfish > somecommand 2>err.log
# This example runs “somecommand” and redirects its stderr to “err.log”.
In the example above, the output from stderr is redirected to the file err.log
. Only the output from stderr is written to this file. If > is used
without a handle, then it redirects output from stdout only.
sfish >./hw1 < in.txt > out.txt
In the example above both the input and output of ./hw1 are being redirected.
hw1’s input will be taken from the file in.txt and it’s output will be written
to the file out.txt .
You’ll have to learn how to manipulate file descriptors carefully using system
calls such as open, close, read, write, dup/dup2, and more.
Finally, you can redirect output from one application to another using the
pipe | operator:
sfish > ls | grep ‘.txt’ | wc -l
In this example, the shell creates three child processes. The first, ls ,
reads the contents of the home directory, which gets redirected to the grep program. grep searches for all instances of the string ‘.txt’ in it’s
input (the output of ls ). The output of grep , i.e., all files with
the .txt extension, is then sent to the wc program. wc counts how many
lines of input it is given. (the number of .txt files in the home
directory)
The following features must be implemented:

  • Add support for all three forms of redirection described above, > , < , and | .
  • Be sure to run several test cases for piping applications together and multiple redirection. Ensure that termination is handled cleanly.
  • Examples:
    • hw1 < in.txt > out.txt
    • ls | grep ‘.txt’ | wc -l

      Look at the man pages for grep, sort, wc, head, tail, etc. for parameters
      and flags.


文章作者: SafePoker
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 SafePoker !
  目录