2011-11-04 65 views
0

我想用C语言在Linux操作系统中编写一个shell。Shell中的C编程语言

什么是在这个项目中使用的库和函数的名称?

谢谢。

+3

你想让图书馆做什么? – trojanfoe

+0

请说明一下,你想编写一个完整的shell程序?,你想从一个程序中调用一个shell命令?,你想将数据传递给一个shell? –

+2

只是libc,这就够了。 –

回答

2

你可能会想,至少是:

  • forkexecv - 用于调用子进程。
  • waitpid - 收获fork + exec产生的死亡子进程。
  • sigaction - 用于安装信号处理程序到:
    • 捕捉中断(CTRL + C)。
    • 收获死亡的孩子进程。
  • open - 用于在重定向到文件/从文件重定向时打开文件。
  • dup2 - 用于在执行重定向时用打开的文件替换STDIN/STDOUT。
  • pipe - 用于创建管道。

Single UNIX Specification Man Pages是一个很好的资源,用于任何其他所需的功能。

1

我不明白你的问题。你开始一件新事物,你可以使用任何你想要的名字。 Project的概念通常针对某些IDE。

要编写一个外壳,首先必须熟悉C编程语言,并理解好几个重要的Linux系统调用(如forkexecvepipechdirdup等)。所以先阅读这本好书。系统调用通过标准的C库可用,您不需要链接额外的一个。

而且,研究小壳的源代码(如sash)可能会对你有很大的帮助。

0

不幸的是,不是一些神奇的emulateShell() API调用就可以弥补这方面,你将需要考虑(在深度)像execforkpopensignal/sigaction事物和其他主机过程控制的东西。

另外,您可能需要参与终端处理等,例如fcntlioctl

这不是一个真正可以全面覆盖的主题是一个这样大小的答案框。我会建议试图在较小的工作中将其分解,以使您的(和我们)的工作更轻松。

也许从一个简单的程序开始,该程序接受来自用户的命令并将它们分解为令牌执行。那将是一个好的第一步。

+2

我不确定他需要* popen *,他需要了解* pipe *系统调用(等等)。 * popen *就像* system *,它使用一个shell,不提供一个。 –

1

实际上,这是一个有趣的问题,对于某些知道Unix的IO机制的人来说,这可能是一个很好的练习。正如您所知,Shell负责解释输入,调用系统调用并显示输出。这样的程序运行在内核之上。因此,该练习可能会给出许多关于流程执行族的信息,如exec*

这里是one tutorial c为你在C中覆盖,这one in Python将帮助你设计一个理解的快速原型。

+0

shell不会将其输入传递给内核。它解释它的输入并相应调用系统调用。 –

+0

我简直太简单了。更正它。 –