Linux 文件描述符设置为非阻塞的方法

通过fcntl设置文件描述符属性

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

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);

或者一步到位的方式:

     fcntl(socket,F_SETFL,fcntl(socket,F_GETFL)|O_NONBLOCK);

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

    flags = fcntl(fd,F_GETFL,0);
    flags &= ~O_NONBLOCK;
    fcntl(fd,F_SETFL,flags);

通过socket API创建非阻塞的socket

</pre><pre name="code" class="cpp">#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocal);

Type 参数指定服务类型,服务类型主要有SOCK_STREAM服务,SOCK_DGREAM服务,值得指出的是,在Linux内核版本2.6.17起,type参数可以接受上述服务的同时也可以接受下面的两个标志与之相与:SOCK_NONBLOCK,SOCK_CLOEXEC,它们分别表示将新创建sock 设为非阻塞的,以及在fork调用创建子进程时在子进程中关闭socket.但是之前的版本并不支持。

1.创建阻塞socket

    int fd_sock = socket(AF_INET,SOCK_STREAM,0);

2.创建非阻塞式socket

    int fd_sock = socket(AF_INET,SOCK_STREAM|SOCK_NONBLOCK,0);

上述代码表示创建的一个新的socket为非阻塞式

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 19:43:35

Linux 文件描述符设置为非阻塞的方法的相关文章

[转帖]linux文件描述符文件/etc/security/limits.conf

linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习了解一下. 文件描述符是什么?和文件句柄有啥区别? 文件描述符是linux/unix操作系统中特有的概念.相当于windows系统中的文件句柄.一个意思不同叫法. Linux系统中, 每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件.标准C中每个进程默认打开的有三个文

[性能分析]linux文件描述符(转)

1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件.这些文件一般是用一些相关的应用程序创建,比如图像工具.文档工具.归档工具... .... 或 cp工具等.这类文件的删除方式是用rm 命令:2.目录文件在l

[性能分析]linux文件描述符

1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件.这些文件一般是用一些相关的应用程序创建,比如图像工具.文档工具.归档工具... .... 或 cp工具等.这类文件的删除方式是用rm 命令:2.目录文件在l

Linux 文件描述符问题

昨天解了个bug,关于文件描述符的,这种问题很久之前也遇到过,这次再犯真的不该. 问题是这样的. fopen()打开一个文件,然后做了一些操作,然后函数执行结束...没有调用fclose()导致了,再执行此函数时,系统提示,文件描述符分配完毕. 分析了下: 根据以前的知识储备, 1.linux打开文件描述符的最大个数为1024,根据这次发现, 2.这是针对于单独进程的, 3.是从/proc/{pid}/fd/这个文件夹下可以看到. 4.分配文件描述符是递增的顺序.(看我之前的博客会发现这是那个b

关于Linux文件描述符的笔记

当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符.所谓的文件描述符是一个低级的正整数.最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应.因此,函数 scanf() 使用 stdin,而函数 printf() 使用 stdout.你可以用不同的文件描述符改写默认的设置并重定向进程的 I/O 到不同的文件. 首先说什么是文件描述符,它有什么作用? 文件描述符是一个简单的整数,用以标明每一个被

Linux 文件描述符

////////////////////////////////////////////////////////////////////////////////////////////////////// 1.UNIX文件描述符 Unix操作系统或者Linux操作系统的文件描述符使用一个非负整数来表示,但是文件描述符不仅仅是一个非负数,Unix对于文件IO有以下几个数据结构: A.       每个进程都有一个进程表,其中有个记录表项,这个记录表项指向的是一个打开文件描述符表,这个文件描述符表是

Linux --- 文件描述符和重定向

1.预备知识 标准输入(stdin).标准输出(stdout)和标准错误(stderr)是编写脚本的时候经常使用的,因为输出的信息可能是上述的一种. 文件描述符 是与打开的某个文件或者数据流相关联的整数.文件描述符0,1,2是系统预留的. 0 - stdin(标准输入) 1 - stdout(标准输出) 2 - stderr(标准错误) 2.实例 echo This is a sample. > temp.txt 可将文本输出到 temp.txt 中,是通过截断文件的方式,也就是说在echo命令

linux文件描述符open file descriptors与open files的区别

一个文件被打开,也可能没有文件描述符,比如current working diretories,memory mapped files and executable text files ;losf可以查岀某个进程打开的文件数目: [email protected] ~]# sh sh-4.1# lsof |grep 1407 rpcbind 1407 rpc cwd DIR 253,0 4096 2 / rpcbind 1407 rpc rtd DIR 253,0 4096 2 / rpcbi

文件描述符设置

系统级的限制     查看上限              sysctl -a | grep 'fs.file-max' 查看使用情况        fs.file-nr 修改上限              在/etc/sysctl.conf文件添加   fs.file-max=65536:    然后执行  sysctl -p 进程级别的限制 查看上限              ulimit -n 查看使用情况        lsof 修改上限 修改/etc/security/limits.co