Shell-kernel交互

时间:2011-12-16 04:54:19

标签: c++ c linux shell kernel

我正在尝试用C和/或C ++编写Linux的shell。我应该使用哪些函数与内核进行交互?有人说使用system(),但我认为它调用shell,这将导致无限递归。其他人对fork()exec()说了些什么。

显然,一个好的shell需要一些方法来访问文件系统。我假设内核为此提供了某种类型的接口,不是吗?我如何读取内核的输出?是文本还是整数?

有没有可以在必要的功能上找到好文档的地方?是否有我可以阅读的特定手册页或源代码文件?

4 个答案:

答案 0 :(得分:5)

内核为低级进程执行和文件系统访问提供了一组“系统调用”。流程执行通常使用fork()exec() family calls之一完成。 I / O可以通过open()stat()opendir()等电话完成。

可以在Open Group Base Specification找到大多数可移植的调用(包括C库和系统调用)的列表(单击“系统接口”)。还有一些特定于Linux的 - 用于普通用途的那些将在手册页的第2部分(ls /usr/share/doc/man/man2man 2 somefunction)中记录。

答案 1 :(得分:3)

一个好的起点是操作系统教科书。我推荐Silberschatz等人的“dinosaur book”。另一个很好的资源是Dave Hollinger教授的RPI课程页面,用于他的操作系统课程。讲座幻灯片在线,包括一篇关于编写shell的讲座。还有一个写作基本shell的作业,你可以查看。

http://cgi2.cs.rpi.edu/~hollingd/opsys/opsys.php

shell是一个非常复杂的程序,无法在StackOverflow答案中真正描述。但是,这些资源应该指向正确的方向。

答案 2 :(得分:1)

system calls所理解的linux kernel列表记录在syscalls(2)手册页中。

shell通常不与所有这些接口连接。 shell通常主要关注影响其可以运行的进程的系统调用。例如,shell通常不需要(通过它自己)调用mmapmprotect系统调用(即使malloc的实现可能调用mmap)。< / p>

答案 3 :(得分:0)

首先,您需要了解现有shell提供的所有功能:

1.分叉可执行文件并执行它们。

2.一个解释器,用于shell脚本。

3.很少有像cd等内置命令。

还有很多东西......我建议你阅读一些UNIX OS书

如果您只想在新shell中运行命令,那么您必须在“/ bin”,“/ usr / bin”等处分叉并执行(或者您可以使其成为线程)现有的可执行文件。

如果它只是一个业余爱好项目,我建议你使用Python子进程模块