阻塞 非阻塞IO
#include "head.h"
int make_nonblock(int fd) {
int flag;
if ((flag = fcntl(fd, F_GETFL)) < 0) {
return -1;
}
flag |= O_NONBLOCK;
if ((fcntl(fd, F_SETFL, flag)) < 0) {
return -1;
}
return 0;
}
int make_block(int fd) {
int flag;
if ((flag = fcntl(fd, F_GETFL)) < 0) {
return -1;
}
flag &= ~O_NONBLOCK;
if (fcntl(fd, F_SETFL, flag) < 0) {
return -1;
}
return 0;
}
#include "head.h"
int main(){
int num = 10;
int num1 = 12;
int temp;
if((temp = make_nonblock(0)) < 0){
perror("make_nonblock");
exit(1);
}
scanf("%d", &num);
if((temp = make_block(0)) < 0){
perror("make_block");
exit(1);
}
scanf("%d", &num1);
printf("num = %d\n", num);
printf("num = %d\n", num1);
return 0;
}
select
#include"head.h"
int main(){
int temp;
int num = 10;
if((temp = make_nonblock(0)) < 0){
perror("make_nonblock");
exit(1);
}
sleep(10);
scanf("%d", &num);
printf("num = %d\n", num);
return 0;
}
#include "head.h"
int main(){
//先清空集合
//把要监控的fd,添加到集合里
//select 监控,设定时间
//操作文件描述符
int num = 10;
fd_set rdfds;
FD_ZERO(&rdfds);
FD_SET(0, &rdfds);
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
int temp = select(1, &rdfds, NULL, NULL, &tv);
if (temp < 0){
perror("select");
exit(1);
}
if(temp > 0){
scanf("%d", &num);
}else{
fprintf(stderr, "timeout\n");
}
printf("num = %d time = %ld\n", num, tv.tv_sec);
return 0;
}
这里看不出来,但是实际演示的时候,select得到想要的输出之后不需要等待,而nonblock需要等过完了10秒才运行结束。
poll
#include "head.h"
#define TIMEOUT 5
int main(){
//文件描述符结构体数组
//确定检测的个数
//设置events
//实现poll
int num = 10;
struct pollfd fds[1];
int nfds = 1;
fds[0].fd = 0;
fds[0].events = POLLIN;
int temp = poll(fds, nfds, 1000 * TIMEOUT);
if (temp < 0){
perror("poll");
exit(1);
}
if(fds[0].revents & POLLIN){
scanf("%d", &num);
}
if (!temp){
fprintf(stderr, "time = %d\n", TIMEOUT);
}
if(fds[0].revents & POLLIN){
scanf("%d", &num);
}
printf("num = %d\n", num);
return 0;
}