Linux文件I/O模型 文件阻塞|非阻塞1 普通文件创写读不会阻塞 #include <fcntl.h>#include <stdio.h>#include <unistd.h>void write_file(int fd){ char buf[]="abcde\n"; write(fd,buf,sizeof(buf)); close(fd);}void read_file(){ int fd; char *path="./test1.txt"; char result[20]; fd=open(path,O_RDONLY); read(fd,result,10); printf("The content is %s",result); close(fd);}int create_file(){ int fd; char *path="/home/zhf/test1.txt"; fd=creat(path,00777); return fd;}int main(){ read_file();}2 终端设备和网络读取会阻塞终端代码#include <unistd.h>#include <stdlib.h>#include <stdio.h>int main(void){ char buf[10]; int n; n = read(STDIN_FILENO, buf, 10); // #define STDIN_FILENO 0 STDOUT_FILENO 1 STDERR_FILENO 2 if(n < 0){ perror("read STDIN_FILENO"); //printf("%d", errno); exit(1); } write(STDOUT_FILENO, buf, n); return 0;}服务端//服务器端 #include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h> #define MAXLINE 4096 int main(int argc, char** argv){ int listenfd, connfd; struct sockaddr_in servaddr; char buff[4096]; int n; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666); if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } if( listen(listenfd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("======waiting for client's request======\n"); while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } n = recv(connfd, buff, MAXLINE, 0); buff[n] = '\0'; printf("recv msg from client: %s\n", buff); close(connfd); } close(listenfd);}使用nc测试nc 192.168.0.3 66663 总结 阻塞与非阻塞是对于文件而言 而不是read,write,终端和网络文件是阻塞的
