1. UNIX基础知识
1.1 DIR结构,dirent结构
dirent.h 头文件包含目录操作的一些函数,opendir() 函数返回指向 DIR结构的指针,readdir() 函数一次读取DIR结构中的一项,返回一个 指向dirent结构的指针,当目录中已无目录可读时则返回null指针。
每个进程都有一个工作目录(working directory,有时称为当前工作目
录(current working directory))。所有相对路径名都从工作目录开始
解释。进程可以用 chdir() 函数更改其工作目录。
1.2 I/O 读写
1.2.1 不用缓存的 I/O
/usr/include/unistd.h 中定义了标准输入/输出文件描述符
#include "ourhdr.h" #define BUFFSIZE 8192 int main ( void ) { int n; char buf[BUFFSIZE]; while ( ( n = read(STDIN_FILENO,buf,BUFFSIZE)) > 0 ) if ( write(STDOUT_FILENO,buf,n) !=n ) err_sys("write error"); if (n <0) err_sys("read error"); exit(0); }
函数 open() 、read() 、write() 、lseek() 以及 close() 提供了不 用缓存的 I/0 。这些函数都用文件描述符进行工作。两个常数 STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中 ,它们指定了 标准输入和标准输出的文件描述符。它们的典型值是 0和1,但是为了可 移植性,我们使用这些新名字。
1.2.2 标准 I/O
标准 I/O 函数提供一种对不用缓存的 I/O 函数的带缓存的界面。使用 标准 I/O 可无需担心如何选取最佳的缓存长度,例如上面示例中的 BUFFSIZE常数。另一个使用标准 I/O 函数的优点与处理输入行有关(常 常发生在 UNIX 的应用中)。例如,fgets() 函数读一完整的行,而另一 方面, read函数读指定字节数。我们最熟悉的标准 I/O 函数是 printf() 。在调用 printf() 的程序中,总是包括 <stdio.h> (通常包 括在我们自定义的 ourhdr.h 中),因为此头文件包括了所有标准 I/O 函数的原型。
#include "ourhdr.h" int main (void) { int c; while ((c=getc(stdin)) != EOF) if (putc(c,stdout) == EOF) err_sys("output error"); if (ferror(stdin)) err_sys("input error"); exit(0); }
函数 getc() 一次读1个字符,然后 putc 将此字符写到标准输出。读到 输入的最后1个字节时,getc() 返回常数 EOF。标准输入、输出常数 stdin 和 stdout 定义在头文件 <stdio.h> 中,它们分别表示标准输入 和标准输出文件。
1.3 程序和进程
进程ID
每个UNIX进程都一定有一个唯一的数字标识符,称为进程 ID(process ID)。进程ID总是
一非负整数。 getpid() 可以得到一个进程的ID。
#include "ourhdr.h" int main (void) { printf ("Hello world from process ID %d\n",getpid()); exit(0); }
进程控制
主要有三个 fork() 、 exec() 、 waitpid() ( exec() 函数有六个变
体,通常统称为 exec() 函数)
2. UNIX标准化
2.1 标准头文件
| <assert.h> | 验证程序断言 |
| <cpio.h> | cpio归档值 |
| <ctype.h> | 字符类型 |
| <dirent.h> | 目录项(4.21节) |
| <errno.h> | 出错码(1.7节) |
| <fcntl.h> | 文件控制(3.13节) |
| <float.h> | 浮点常数 |
| <ftw.h> | 文件树漫游 (4.21节) |
| <grp.h> | 组文件(6.4节) |
| <langinfo.h> | 语言信息常数 |
| <limits.h> | 实施常数(2.5节) |
| <locale.h> | 本地类别 |
| <math.h> | 数学常数 |
| <nl_types.h> | 消息类别 |
| <pwd.h> | 口令文件(6.2节) |
| <regex.h> | 正则表达式 |
| <search.h> | 搜索表 |
| <setjmp.h> | 非局部goto(7.10节) |
| <signal.h> | 信号(第10章) |
| <stdarg.h> | 可变参数表 |
| <stddef.h> | 标准定义 |
| <stdio.h> | 标准I/O库(第5章) |
| <stdlib.h> | 公用函数 |
| <string.h> | 字符串操作 |
| <tar.h> | tar归档值 |
| <termios.h> | 终端I/O(第11章) |
| <time.h> | 时间和日期 (6.9节) |
| <ulimit.h> | 用户限制 |
| <unistd.h> | 符号常数 |
| <utime.h> | 文件时间(4.19节) |
| <sys/ipc.h> | IPC(14.6节) |
| <sys/msg.h> | 消息队列(14.7节) |
| <sys/sem.h> | 信号量(14.8节) |
| <sys/shm.h> | 共享存储(14.9节) |
| <sys/stat.h> | 文件状态(第4章) |
| <sys/times.h> | 进程时间(8.15节) |
| <sys/types.h> | 原系统数据类型(2.7节) |
| <sys/utsname.h> | 系统名(6.8节) |
| <sys/wait.h> | 进程控制(8.6节) |
3. 文件 I/O
3.1 引言
可用的文件I/O函数——打开文件、读文件、写文件等等。大多数UNIX文件 I/O只需用到5个函数:open、read、write、lseek 以及close。
3.2 open()
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char 路径名,int 选项,...);
3.3 read()
如read成功,则返回读到的字节数。如已到达文件的尾端,则返回 0。
