1、引言
2、UNIX体系结构
- 操作系统
一种软件,控制计算机硬件资源,提供程序运行环境。操作系统包含了内核和一些其他软件(如shell、公用函数库、应用程序等)。例如Linux就是GNU操作系统的内核,因此也称为GNU/Linux操作系统。 - 系统调用
内核的接口 - 公用函数库
构建在系统调用之上 - 应用程序
既可以使用共用函数库,也可以使用系统调用 - shell
是一个特殊的应用程序,为运行其他应用程序提供了一个接口
3、登录
4、文件和目录
-
根目录
所有东西的起点是根(root)目录,该目录的名称是一个字符/
-
目录
目录是一个包含目录项的文件。在逻辑上(实际上不是)每个目录项包含了文件名和一些属性信息(类型、大小、所有者和权限等)。创建新目录时都会创建两个文件(两个目录项):.
和..
,.
指向当前目录,..
指向父目录。 -
路径名
以/
开头的路径名为绝对路径,以根目录为起始。其他的路径名为相对路径,以当前目录作为起始。 -
工作目录
- 每个进程都有一个工作目录,有时称为当前工作目录。所有相对路径都从工作目录开始解释,进程可用
chdir
系统调用更改其工作目录,通过getcwd
系统调用获取当前工作目录。 - 注意:假如在目录A中运行了目录B中的程序,那么进程B的工作目录是目录A
- 每个进程都有一个工作目录,有时称为当前工作目录。所有相对路径都从工作目录开始解释,进程可用
-
起始目录
登录时,工作目录设置为起始目录,一登录就位于的目录即为起始目录,该目录从口令文件中对应登录项中获得。 -
ls(1)
命令的简要实现
ls(1)
这种写法提示你通过man 1 ls
这种方法查看ls
对应的手册页,下面是ls
的简要实现#include "apue.h" // 针对本书创建的头文件,包括很多常量和函数原型,在该文件中有err_xxx函数 #include <dirent.h> // 方便使用 opendir和readdir等函数的原型 int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; /* 只能传递2个参数,否则产生错误信息*/ if (argc != 2) err_quit("usage: ls directory_name"); /* opendir函数返回指向DIR的指针,如果目录项中无目录可读,则产生错误信息 */ if ((dp = opendir(argv[1])) == NULL) err_sys("can't open %s", argv[1]); /* 在循环中调用readdir来读每个目录项,返回一个指向dirent的指针 */ while ((dirp = readdir(dp)) != NULL) /*取出dirent结构体中每个目录项的名字(d_name)*/ printf("%s\n", dirp->d_name); closedir(dp); /*函数exit终止程序,参数0意思是正常结束,1~255则表示出错*/ exit(0); }
示例输出如下:
/*语法错误*/ lh@LH_LINUX:~/桌面/Program/apue.3e/intro$ ./ls1 usage: ls directory_name /*打开目录错误,错误类型有多种*/ lh@LH_LINUX:~/桌面/Program/apue.3e/intro$ ./ls1 /etc/ssl/private/ can't open /etc/ssl/private/: Permission denied lh@LH_LINUX:~/桌面/Program/apue.3e/intro$ ./ls1 /dev/tty can't open /dev/tty: Not a directory /*注意:ls命令会按照字典序输出,但这里并未如此*/ lh@LH_LINUX:~/桌面/Program/apue.3e/intro$ ./ls1 . shell2 .. hello.c Makefile shell2.c mycat.c ls1 uidgid testerror.c uidgid.c shell1.c shell1 . ls1.c hello 1 getcputc.c testerror getcputc mycat