Advanced Programming in UNIX Environment Episode 14

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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...