Advanced Programming in UNIX Environment Episode 14

前端之家收集整理的这篇文章主要介绍了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都要等待,直至数据已写到磁盘上再返回。

猜你在找的Bash相关文章