0

我希望我的 shell 能够运行

cat file.txt 

ls -l

我不知道该怎么做,因为cat第二个参数总是一个文本文件,但是,ls第二个参数等命令不是,所以我必须以不同的方式执行它。我不确定如何正确处理这两种情况。

4

2 回答 2

0

您的 shell 应该为第一个参数寻找匹配的二进制文件,并将所有后续参数作为字符串传递给第一个程序。您的外壳不负责确定参数的含义,它运行的程序是。

您的 shell 应该调用 fork(),然后在子进程中(fork() 的返回值 == 0),它将调用不同的 exec 命令之一来运行用户指定的程序。同时,原始进程正在等待 fork 的子进程使用 waitpid() 完成。

http://linux.die.net/man/3/exec

您会看到其中许多将字符指针数组作为参数。您会将后续参数传递给 exec'd 二进制文件,以供其读取和解析自身。

于 2013-05-19T03:17:22.747 回答
0

最好的方法之一是根据一个或多个分隔符(空格、制表符等)剪切字符串,并用生成的单词填充数组。将每个单词放入字符串数组 ( "cat file.twt"=> "cat", "file.txt") 后,就可以调用 exec* 函数(例如:execve)。

对于执行,根据您需要执行的操作,您可能需要:

  • exec* 函数(execve、execlp 等)
  • fork (因为你正在编写一个 shell,你需要保持你的进程活着)
  • wait/waitpid 避免僵尸进程
  • dup*/pipe 如果您需要使用文件描述符。

最后,由于你正在编写一个 shell,你不应该关心每个二进制文件期望的参数,因为它不是 shell 的工作(至少在这一点上)

于 2013-05-19T10:34:14.580 回答