fcntl

作者: 小叶大孟 | 来源:发表于2018-05-02 20:28 被阅读0次

    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\n",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;

    }

    相关文章

      网友评论

          本文标题:fcntl

          本文链接:https://www.haomeiwen.com/subject/stfhrftx.html