数控编程最基础知识入门,c语言read函数怎么非阻塞

在C语言中,read函数用于从指定文件描述符(fd)中读取数据,如read(fd, buf, count)函数可从文件描述符fd读取count个字符到buf缓冲区中。这个函数在默认情况下是会阻塞的,也就是当没有数据输入时,程序会一直等待直到有数据输入为止。但是有时候我们需要将read函数设置成非阻塞的,以便能够在没有数据输入时立即返回并进行其他操作,本文将对如何设置read函数为非阻塞进行详细介绍。

让read函数变成非阻塞的方法有两种:

1.使用fcntl函数进行设置

fcntl函数是通用文件控制函数,它可以用来改变打开文件的各种属性,包括文件的描述符,访问模式和文件状态标志等。使用fcntl函数可以将文件描述符设置成非阻塞模式,从而使read函数变成非阻塞模式。

具体实现方法如下:

```

#include

#include

#include

int main(){

int fd = open("/dev/input/mouse0", O_RDONLY | O_NONBLOCK);

char buf[256];

ssize_t len;

while(1){

len = read(fd, buf, sizeof(buf));

if(len > 0)

printf("Read %ld bytes\n", len);

usleep(1000);

}

return 0;

}

```

上述例子中,我们通过open函数打开一个鼠标输入设备,并且在open函数的第二个参数中使用O_NONBLOCK标志将文件描述符设置成了非阻塞模式。这样就可以在read函数调用时立即返回,如果没有数据输入,read函数的返回值将是-1,errno会被设置成EAGAIN或EWOULDBLOCK表示当前数据不可用,程序可以继续运行而不是一直等待数据的输入。

2.使用select函数进行设置

select函数是一种多路复用I/O函数,它可以监视多个文件描述符的状态,如果某个文件描述符的状态发生了变化(比如可读可写),那么select函数就会通知程序。使用select函数也可以将文件描述符设置成非阻塞模式。

具体实现方法如下:

```

#include

#include

#include

#include

#include

#include

#include

int main(){

fd_set readfds;

struct timeval timeout;

int ret, fd, len;

char buf[256];

fd = open("/dev/input/mouse0", O_RDONLY | O_NONBLOCK);

if(fd < 0){

perror("Failed to open device");

exit(1);

}

while(1){

FD_ZERO(&readfds);

FD_SET(fd, &readfds);

timeout.tv_sec = 1;

timeout.tv_usec = 0;

ret = select(fd+1, &readfds, NULL, NULL, &timeout);

if(ret == -1){

perror("select error");

exit(1);

}else if(ret == 0){

printf("Timeout\n");

continue;

}

if(FD_ISSET(fd, &readfds)){

len = read(fd, buf, sizeof(buf));

if(len < 0 && (errno == EAGAIN || errno == EWOULDBLOCK))

continue;

printf("Read %d bytes\n", len);

}

}

return 0;

}

```

上述例子中,我们使用了select函数对文件描述符进行监视,当文件描述符准备好读取时,select函数将返回一个大于0的值。FD_SET宏用于将文件描述符加入监视中,FD_ISSET宏用于判断文件描述符是否可读可写。如果文件描述符没有数据输入,read函数将返回-1,并且errno会被设置成EAGAIN或EWOULDBLOCK,程序可以立即返回并在稍后继续进行读取操作。

总结:

本文对如何将C语言中的read函数设置成非阻塞模式进行了详细介绍,一般来说可以使用fcntl函数和select函数进行设置。使用这两个函数的时候需要格外注意代码的正确性,以防导致程序运行出错。

如果你喜欢我们阿吉时码(www.ajishima.com.cn)的文章, 欢迎您分享或收藏分享网文章 欢迎您到我们的网站逛逛喔!SLG资源分享网
友情提示:抵制不良游戏,拒绝盗版游戏。 注意自我保护,谨防受骗上当。 适度游戏益脑,沉迷游戏伤身。 合理安排时间,享受健康生活。适龄提示:适合18岁以上使用!
点赞(82) 打赏

评论列表 共有 1 条评论

凌云児 1年前 回复TA

每样工作都有快乐,同理,每样工作也都有苦恼。现在的问题是,这份快乐是否相宜于你?快乐也是有质量高下,持续长久之分的。有的快乐,只是好奇。有的快乐,却如醇酒。——毕淑敏

立即
投稿
发表
评论
返回
顶部