从这里开始。用的是APUE第三版。从第三版65页开始:
3.14fcntl函数
在修改文件描述符标志和文件状态标志时必须谨慎,先要取得现有的标志值,然后根据需要修改它,最后设置新值。
程序3-5:对一个文件描述符设置一个或者多个文件状态标志函数。
#include "apue.h"
#include <fcntl.h>
#include "error.c"
void set_f1(int fd, int flags)
{
int val;
if ((val = fcntl(fd, F_GETFL, 0)) < 0)
err_sys("fcntl F_GETFL ERROR");
val |= flags; /*trun on flags*/
if (fcntl(fd,F_SETFL, val) < 0)
err_sys("fcntl F_SETFL error)");
}
fsync和fdatasync在我们需要时更新文件内容,O_SYNC标志则在我们每次写至文件时更新文件内容。
3.15ioctl函数
ioctl函数是I/O操作的杂物箱,终端I/O是ioctl函数最大使用方面。
#include <unistd.h>
#include <sys/ioctl.h>
#include <stropts.h>
int ioctl(int filedes, int request, ...) //出错返回-1,成功返回其他值。
这个函数主要用于设备的操作。
3.16 /dev/fd
这个目录中的文件时用数字来表示的。如1 2 3 等。
打开文件/dev/fd/n等效于复制描述符n(假设描述符n是打开的)。
用法:
fd = open("/dev/fd/0", mode) 但是大部分系统忽略它所指定的mode。
等价于 fd = dup(0); 所以描述符0和fd共享同一个文件表项。