我正在尝试用C和/或C ++编写Linux的shell。我应该使用哪些函数与内核进行交互?有人说使用system()
,但我认为它调用shell,这将导致无限递归。其他人对fork()
和exec()
说了些什么。
显然,一个好的shell需要一些方法来访问文件系统。我假设内核为此提供了某种类型的接口,不是吗?我如何读取内核的输出?是文本还是整数?
有没有可以在必要的功能上找到好文档的地方?是否有我可以阅读的特定手册页或源代码文件?
答案 0 :(得分:5)
内核为低级进程执行和文件系统访问提供了一组“系统调用”。流程执行通常使用fork()
和exec()
family calls之一完成。 I / O可以通过open()
,stat()
,opendir()
等电话完成。
可以在Open Group Base Specification找到大多数可移植的调用(包括C库和系统调用)的列表(单击“系统接口”)。还有一些特定于Linux的 - 用于普通用途的那些将在手册页的第2部分(ls /usr/share/doc/man/man2
或man 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通常不需要(通过它自己)调用mmap或mprotect系统调用(即使malloc
的实现可能调用mmap
)。< / p>
答案 3 :(得分:0)
首先,您需要了解现有shell提供的所有功能:
1.分叉可执行文件并执行它们。
2.一个解释器,用于shell脚本。
3.很少有像cd等内置命令。
还有很多东西......我建议你阅读一些UNIX OS书
如果您只想在新shell中运行命令,那么您必须在“/ bin”,“/ usr / bin”等处分叉并执行(或者您可以使其成为线程)现有的可执行文件。
如果它只是一个业余爱好项目,我建议你使用Python子进程模块