#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,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都要等待,直至数据已写到磁盘上再返回。