1. UNIX基础知识
1.1 DIR结构,dirent结构
1.2 I/O 读写
1.3 程序和进程
2. UNIX标准化
2.1 标准头文件
3. 文件 I/O
3.1 引言
3.2 open()
3.3 read()

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。