UNIX:
程序的执行实例被称为进程;
UNIX 环境高级编程:
1.调用open函数可以打开或创建一个文件.
2.可以调用creat函数创建一个新文件.
3.close函数关闭一个打开的文件.
4.lseek函数:每个打开的文件都有一个与其相关联的"当前文件偏移量".他通常是一个非负整数
Ex1:测试能否对标准输入设置偏移量:
Ex2:创建一个具有空洞的文件:
5.read()函数,如read成功.则返回读到的字节数.如已达到文件结尾,则返回0.
6.write()函数,调用write函数向打开的文件写数据. write出错的一个常见原因是:磁盘已写满,或者超过了一个给定进程的文件长度限制.
7.文件共享,内核用三种数据结构表示打开的文件, 它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。
(1)每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视为一个矢量,
每个描述符占用一项.
(2)内核为所有打开文件维持一张文件表.
(3)每个打开文件都有一个V节点结构.
V节点包含了文件类型和对此文件进行各种操作的函数的指针.
注:linux没有使用V节点,而是使用了通用的i节点结构.
文件描述符标志:只用于一个进程的一个描述符;
文件描述符状态标志:适用于指向该给定文件表项的任何进程中的所有描述符.
所以,当多个进程写同一文件时,则可能产生预期不到的结果.
8. 原子操作
任何一个需要多个函数调用的操作都不可能是原子操作,因为在两个函数调用之间,内核有可能会临时挂起该进程.UNIX系统提供了一种方法使这种操作成为原子操作,该方法是在打开文件时设置O_APPEND标志。这就使内核每次对该文件进行写之前,都将进程的当前偏移量设置到改文件的尾端处,于是每次写之前就不再需要调用lseek();
8.1.pread()和pwrite()函数.
8.2.dup和dup2函数.用来复制一个现存的文件描述符.
由dup返回的新文件描述符一定是当前可用文件描述符中最小的数值.
8.3.fcntl()函数可以改变已打开的文件的性质.
fcntl函数有5种功能:
(1)复制一个现有的描述符
(2)获得/设置文件描述符标记
(3)获得/设置文件状态标志
(4)获得/设置一步I/O所有权
(5)获得/设置记录锁.
程序的执行实例被称为进程;
UNIX 环境高级编程:
1.调用open函数可以打开或创建一个文件.
2.可以调用creat函数创建一个新文件.
3.close函数关闭一个打开的文件.
4.lseek函数:每个打开的文件都有一个与其相关联的"当前文件偏移量".他通常是一个非负整数
Ex1:测试能否对标准输入设置偏移量:
#include "apue.h"
int
main(void)
{
if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1 )
{
printf("can't seek\n");
}
else
{
printf("seek OK\n");
}
exit(0);
}
Ex2:创建一个具有空洞的文件:
#include "apue.h"
#include <fcntl.h>
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";
int main(void)
{
int fd;
if ((fd = creat("file.hole", FILE_MODE)) < 0)
{
err_sys("creat error");
}
if (write(fd, buf1, 10) != 10)
{
err_sys("write error");
}
if (lseek(fd, 16384, SEEK_SET) == -1)
{
err_sys("seek error");
}
if (write(fd, buf2, 10) != 10)
{
err_sys("write error");
}
exit(0);
}
5.read()函数,如read成功.则返回读到的字节数.如已达到文件结尾,则返回0.
6.write()函数,调用write函数向打开的文件写数据. write出错的一个常见原因是:磁盘已写满,或者超过了一个给定进程的文件长度限制.
#include "apue.h"
#define BUFFSIZE 4096
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);
}
7.文件共享,内核用三种数据结构表示打开的文件, 它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。
(1)每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视为一个矢量,
每个描述符占用一项.
(2)内核为所有打开文件维持一张文件表.
(3)每个打开文件都有一个V节点结构.
V节点包含了文件类型和对此文件进行各种操作的函数的指针.
注:linux没有使用V节点,而是使用了通用的i节点结构.
文件描述符标志:只用于一个进程的一个描述符;
文件描述符状态标志:适用于指向该给定文件表项的任何进程中的所有描述符.
所以,当多个进程写同一文件时,则可能产生预期不到的结果.
8. 原子操作
任何一个需要多个函数调用的操作都不可能是原子操作,因为在两个函数调用之间,内核有可能会临时挂起该进程.UNIX系统提供了一种方法使这种操作成为原子操作,该方法是在打开文件时设置O_APPEND标志。这就使内核每次对该文件进行写之前,都将进程的当前偏移量设置到改文件的尾端处,于是每次写之前就不再需要调用lseek();
8.1.pread()和pwrite()函数.
8.2.dup和dup2函数.用来复制一个现存的文件描述符.
由dup返回的新文件描述符一定是当前可用文件描述符中最小的数值.
8.3.fcntl()函数可以改变已打开的文件的性质.
fcntl函数有5种功能:
(1)复制一个现有的描述符
(2)获得/设置文件描述符标记
(3)获得/设置文件状态标志
(4)获得/设置一步I/O所有权
(5)获得/设置记录锁.