Linux中的阻塞(Blocking)和非阻塞(Non-blocking)写法主要涉及到文件描述符(File Descriptor)的操作模式,特别是在进行I/O操作时的行为差异。
阻塞写法:
非阻塞写法:
EAGAIN
或EWOULDBLOCK
),而不是阻塞等待。阻塞写法:
非阻塞写法:
阻塞模式:
非阻塞模式:
设置非阻塞模式:
#include <fcntl.h>
#include <unistd.h>
int set_nonblocking(int fd) {
int flags = fcntl(fd, F_GETFL, 0);
if (flags == -1) return -1;
flags |= O_NONBLOCK;
return fcntl(fd, F_SETFL, flags);
}
非阻塞写操作示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
void write_to_fd(int fd, const char *data, size_t len) {
ssize_t written = 0;
while (written < len) {
ssize_t result = write(fd, data + written, len - written);
if (result == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// 缓冲区满,稍后重试
continue;
} else {
perror("write");
break;
}
}
written += result;
}
}
int main() {
int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);
if (fd == -1) {
perror("open");
return 1;
}
set_nonblocking(fd);
const char *message = "Hello, World!";
write_to_fd(fd, message, strlen(message));
close(fd);
return 0;
}
问题:非阻塞写操作时频繁收到EAGAIN
或EWOULDBLOCK
错误。
通过合理设置文件描述符的操作模式,并结合有效的I/O多路复用技术,可以显著提高Linux系统下应用程序的性能和响应能力。
领取专属 10元无门槛券
手把手带您无忧上云