我正在尝试用C和/或C++为Linux编写一个shell。我应该使用哪些函数来与内核交互?有人说使用system(),但我认为它调用外壳,这将导致无限递归。其他人说了些关于fork()和exec()的事。
显然,一个好的shell需要某种方式来访问文件系统。我假设内核为此提供了某种接口,不是吗?如何读取内核的输出?它是文本还是整数?
有没有地方可以找到关于必要功能的好文档?是否有我应该阅读的特定手册页或源代码文件?
发布于 2011-12-16 12:59:48
内核为低级进程执行和文件系统访问提供了一组“系统调用”。流程执行通常使用fork()和exec() family calls之一来完成。I/O可以通过诸如open()、stat()、opendir()等调用来完成。
大多数可移植性更强的调用(包括C库调用和系统调用)的列表可以在Open Group Base Specification中找到(单击“系统接口”)。也有一些特定于linux的版本--那些打算用于普通用途的版本将在手册页(ls /usr/share/doc/man/man2或man 2 somefunction)的第2部分进行说明。
发布于 2011-12-16 13:04:24
操作系统教科书是一个很好的起点。我推荐Silberschatz等人的"dinosaur book“。另一个很好的资源是Dave Hollinger教授在RPI的操作系统课程的课程页面。讲座幻灯片在网上,其中包括一堂关于编写shell的讲座。还有一个关于编写一个基本shell的家庭作业,你可以查看。
http://cgi2.cs.rpi.edu/~hollingd/opsys/opsys.php
shell是一个非常复杂的程序,不能用StackOverflow回答来描述。但是,这些资源应该会为您指明正确的方向。
发布于 2011-12-16 15:23:07
linux kernel可以理解的system calls列表记录在syscalls(2)手册页中。
一个shell通常不会连接到所有的接口。shell通常最关心的是影响它可以运行的进程的系统调用。例如,shell通常不需要(自己)调用mmap或mprotect syscall(即使malloc的实现可能调用mmap)。
https://stackoverflow.com/questions/8529937
复制相似问题