我们知道,所有的套接字都默认是阻塞IO.那么怎么将其改为非阻塞呢?
有一个函数fcntl,就可以将其设置为非阻塞.
#include <fcntl.h>
int fcntl(int fd,int cmd,...);
参数cmd一般有一下几种方式:
- 复制一个现有的文件描述符(cmd = F_DUPFD)
- 获得/设置文件描述符标记(cmd = FGGETFD/FSETFD)
- 获得/设置文件状态标记(cmd = FGETFL/FSETFL)(通过这个功能就可以将文件描述符设置为非阻塞)
基于上面的函数我们可以实现一个非阻塞的从标准输入获取
代码如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/select.h>
#include <fcntl.h>
//把文件描述符设置为非阻塞
void SetNoFlag(int fd)
{
//首先去获取文件标记
int flag = fcntl(fd,F_GETFL);
if(flag < 0)
{
perror("fcntl");
return;
}
//将其设置为非阻塞的方式
fcntl(fd,F_SETFL,flag|O_NONBLOCK);
}
int main()
{
SetNoFlag(0); //将标准输入设置为非阻塞IO
char buf[1024] = {0};
while(1)
{
ssize_t read_size = read(0,&buf,sizeof(buf) - 1);
if(read_size < 0)
{
perror("read");
continue;
}
if(read_size == 0)
{
return 0;
}
printf("%s\n",buf);
}
return 0;
}
设置为非阻塞后:如果read没成功,就会报一个资源暂时不可用的错误.