linux下使用NON_BLOCK的write写法
时间: 2023-06-05 11:08:56 浏览: 55
非常感谢您的提问。关于linux下使用NON_BLOCK的write写法,您可以通过以下代码实现:
```
ssize_t nonblock_write(int fd, const void *buf, size_t count) {
ssize_t ret, written = 0;
while (written < count) {
if ((ret = write(fd, buf + written, count - written)) == -1) {
if (errno == EINTR || errno == EAGAIN) {
continue;
}
else {
return -1;
}
}
if (ret == 0) {
break;
}
written += ret;
}
return written;
}
```
该代码实现了一个非阻塞的写入函数,使用方式与普通的write函数相同,但是在数据不能立即写入时,不会阻塞等待直到写入完成,而是返回错误码或者数据未写入的字节数。希望对您有帮助。
相关问题
写一个linux下用NON_BLOCK的write例子
好的,以下是一个使用NON_BLOCK的write的例子:
```c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main()
{
int fd;
fd = open("/dev/tty", O_WRONLY | O_NONBLOCK);
if(fd == -1)
{
perror("open error");
return -1;
}
char buff[1024];
memset(buff, 0, sizeof(buff));
strcpy(buff, "Hello, world!\n");
int ret = write(fd, buff, strlen(buff));
if(ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
{
printf("Write would block\n");
}
else if(ret == -1)
{
perror("write error");
return -1;
}
else
{
printf("Write succeeded\n");
}
close(fd);
return 0;
}
```
在这个例子中,我们使用`open`函数打开`/dev/tty`设备,并且指定了`O_WRONLY`和`O_NONBLOCK`参数。这样打开的文件描述符就是一个非阻塞的写文件描述符。
我们使用`write`函数向这个文件描述符写入数据,并且检查返回值。如果返回-1并且`errno`是`EAGAIN`或者`EWOULDBLOCK`,那么说明写操作会阻塞,我们就可以根据情况进行处理。
最后我们使用`close`函数关闭文件描述符,释放资源。
linux系统 TCP NON_ESTABLISHED 如何排查
1. 使用netstat命令查看当前TCP连接状态,包括非建立状态的连接:
```
netstat -ant | grep -i "non_established"
```
2. 使用tcpdump命令捕获网络数据包,分析数据包中的TCP头部信息,查看非建立状态的连接是否存在异常:
```
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != (tcp-syn|tcp-ack)' -nn
```
3. 使用strace命令跟踪进程的系统调用,查看进程在建立TCP连接时是否存在异常:
```
strace -e connect,accept,recvfrom,sendto -p <PID>
```
4. 使用lsof命令查看当前打开的文件和网络连接,查看是否存在异常的TCP连接:
```
lsof -iTCP -n -P | grep -i "non_established"
```
5. 使用iptables命令查看当前的防火墙规则,查看是否存在防火墙拦截了非建立状态的TCP连接:
```
iptables -L -n -v
```