• fcntl


    fcntl是计算机中的一种函数,通过fcntl可以改变已打开的文件性质。fcntl针对描述符提供控制。参数fd是被参数cmd操作的描述符。针对cmd的值,fcntl能够接受第三个参数int arg。

    fcntl的返回值与命令有关。如果出错,所有命令都返回-1,如果成功则返回某个其他值。

    定义函数

     int fcntl (int fd, int cmd); 

    int fcntl (int fd, int cmd, long arg); 

    int fcntl (int fd, int cmd, struct flock *lock);

    fcntl()针对(文件)描述符提供控制.参数fd 是被参数cmd操作(如下面的描述)的描述符.

    针对cmd的值,fcntl能够接受第三个参数int arg

    fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,阻塞设置成非阻塞,非阻塞设置成阻塞(这连个在开发中可以封装为基本函数)

    1、获取文件的flags,即open函数的第二个参数:

           flags = fcntl(fd,F_GETFL,0);

    2、设置文件的flags:

          fcntl(fd,F_SETFL,flags);

    3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:

           flags = fcntl(fd,F_GETFL,0);

           flags |= O_NONBLOCK;

          fcntl(fd,F_SETFL,flags);

    4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞:

          flags = fcntl(fd,F_GETFL,0);

          flags &= ~O_NONBLOCK;

          fcntl(fd,F_SETFL,flags);

    获取和设置文件flags举例::

    char buf[500000];

    int main(int argc,char *argv[])

    {

    int ntowrite, nwrite;

    const char *ptr ;

    int flags;

    ntowrite = read(STDIN_FILENO,buf,sizeof(buf));

    if(ntowrite < 0) 

            perror("read STDIN_FILENO fail:");

            exit(1);

    fprintf(stderr,"read %d bytes ",ntowrite);

    if (( flags = fcnt l(STDOUT_FILENO ,F_GETFL,0 )) == -1)

            perror("fcntl F_GETFL fail:");

            exit(1);

     flags |= O_NONBLOCK;

     if ( fcntl( STDOUT_FILENO, F_SETFL, flags ) == -1)

            perror("fcntl F_SETFL fail:");

            exit(1);

    ptr = buf;

    while(ntowrite > 0)

            nwrite = write(STDOUT_FILENO,ptr,ntowrite);

            if ( nwrite == -1) 

            {

                    perror("write file fail:");

            } 

        if ( nwrite > 0)

        { 

            ptr += nwrite;

            ntowrite -= nwrite;

        } 

     flags &= ~O_NONBLOCK;

     if ( fcntl( STDOUT_FILENO, F_SETFL, flags) == -1)

                    perror("fcntl F_SETFL fail2:");

     } 

    return 0;



    转自:https://www.jianshu.com/p/0b4fc5b3e89f

  • 相关阅读:
    wenti
    vim
    在两种情况下设备与驱动会发生匹配
    用Qt图形视图框架开发拼图游戏
    Android RecyclerView添加Header头部
    Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果
    Java 集合深入理解(4):List<E> 接口
    你们公司有职业通路图吗
    linux系统性能监控--内存利用率
    linux系统性能监控--CPU利用率
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13450646.html
Copyright © 2020-2023  润新知