Advanced Programming in UNIX Environment Episode 14

来源:互联网 发布:淘宝怎么赚集分宝 编辑:程序博客网 时间:2024/05/20 03:08
#include "apue.h"#include <fcntl.h>int main(int argc, char *argv[]){    int val;    if(argc!=2)    {        err_quit("usage: a.out <descriptor#>");    }    if((val=fcntl(atoi(argv[1]), F_GETFL,0))<0)    {        err_sys("fcntl error for fd %d",atoi(argv[1]));    }    switch(val&O_ACCMODE)    {        case O_RDONLY:            printf("read only");            break;        case O_WRONLY:            printf("write only");            break;        case O_RDWR:            printf("read write");            break;        default:            err_dump("unknown access mode");    }    if(val&O_APPEND)    {        printf(", append");    }    if(val&O_NONBLOCK)    {        printf(", nonblocking");    }    if(val&O_SYNC)    {        printf(", synchronous writes");    }#if !define(_POSIX_C_SOURCE)&&defined(O_FSYNC)&&(O_FSYNC!=O_SYNC)    if(val&O_FSYNC)    {        printf(", synchronous writes");    }#endif    putchar("\n");    return 0;}

对于指定文件描述符打印文件标志

#include "apue.h"#include <fcntl.h>void set_fl(int fd, int flags){    int val;    if((val=fcntl(fd,F_GETFL,0))<0)    {        err_sys("fcntl F_GETFL error");    }    val|=flags;    if(fcntl(fd,F_SETFL,val)<0)    {        err_sys("fcntl F_SETFL error");    }}

对一个文件描述符开启一个或多个文件状态标志
中间一条语句改为:

val&=~flags;

就构成另一个函数,我们成为clr_fl。此语句是当前文件状态标志值val与flags的反码进行逻辑“与”运算。
在开始处加上一句以调用set_fl,则开启了同步写标志。

set_fl(STDOUT_FILENO,O_SYNC);

这就使每次write都要等待,直至数据已写到磁盘上再返回。

ioctl函数一直是I/O操作的杂货箱。终端I/O是使用ioctl最多的地方。

#include <unistd.h>#include <sys/ioctl.h>int ioctl(int fd, int request, ...);

对于ISO C原型,他用省略号表示其余参数。但是,通常只有另外一个参数,他常常是指向一个变量或结构的指针。
在此原型中,表示的只是ioctl函数本身所要求的头文件。通常,还要求另外的设备专用头文件。终端I/O的命令都需要头文件

fd=open("dev/fd/0",mode);

大多数系统忽略它所指定的mode,而另外一些系统则要求mode必须是所引用的文件(在这里是标准输入)初始打开时所使用的打开模式的一个子集。