加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Advanced Programming in UNIX Environment Episode 14

发布时间:2020-12-15 09:18:33 所属栏目:安全 来源:网络整理
导读:#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 ]))
#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都要等待,直至数据已写到磁盘上再返回。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读