1,write原型,参数及返回值。

#include <unistd.h>ssize_t write(int fd, const void *buf, size_t nbytes);

------函数write 只是将用户进程中的数据拷贝到内核缓冲区中,拷贝数据的大小取决于内核缓冲区的大小与nbytes。

参数:

fd:标示某个套接字;

buf:进程中需要往对端发送的数据;

nbytes:需要发送的数据长度。

返回值:

-1:相应的错误码会写到error中。

error :EAGAIN 或 EWOULDBLOCK,表示缓冲区已满,此时无法写入,需要等待下次机会。(EAGAIN和EWOULDBLOCK 两者本质一样,只是分别用于不同的系统,前者是gnu,即linux,后者是bsd系统,都表示缓冲区已满,无空间可写)

error:EPIPE,这是一种典型的错误场景,当client A 已经关闭了,server B 由于网络延迟等原因未察觉,依然向这个已关闭的fd,执行write时,内核会向B 返回 EPIPE错误码,并产生SIGPIPE,默认情况下,进程对该信号的动作是自动退出,所以一般服务器需要处理该信号。

>0:写入内核缓冲区的数据大小。

=0:返回一般不会为0,根据第3个参数的值,如果为0,则表示啥都不执行,write返回0。

2,write 在阻塞和非阻塞下的区别。

  • 阻塞下

当内核缓冲区大小不足以容纳需要写入的 nbytes,write一直阻塞等待,直到缓冲区大小 >= nbytes 时,write一次性copy,等待的过程中,有可能会被信号中断。

当内核缓冲区大小能够容纳需要写入的nbytes,write copy到缓冲区,并返回 nbytes。

  • 非阻塞

坚持的原则是有多少写多少,如果内核缓冲区空间足够,同阻塞情况,一次性copy;如果缓冲区不够,则缓冲区的大小是有多少就写入多少,并返回该值,显然返回值小于nbytes,此种情况需要循环的方式将nbytes数据写到缓冲区;如果缓冲区是满的,则返回-1,并置error值为EAGAIN 或 EWOULDBLOCK。

3,write 的循环写入。

int nwrite(int fd, char *buf, int nbytes)
{int len = 0;char *ptr = buf;int left = nbytes;while(left){len = write(fd, ptr, left);if(len < 0){if(error == EAGAIN)len = 0;elsereturn -1;    //真正的错误}if(len == 0){break;}left -= len;ptr += len;}return nbytes;
}

4,write 遗留几个问题?

write非阻塞的时候需要检测中断吗?

write一次性能最大写入缓冲区多少字节?

5,总结

write 阻塞下 非阻塞
缓冲区满 一直等待 返回-1,并置error为EAGAIN
有缓冲区,但不够指定写的大小 一直等待,直到有足够空间 写入一部分,并返回该写入的部分大小
有缓冲区,而且大小也够 一次性写入 一次性写入

网络编程 write 阻塞和非阻塞下的区别相关推荐

  1. 网络编程 read 阻塞和非阻塞下的区别

    1,read 原型,参数以及返回值. #include <uinstd.h>ssize_t read(int fd, void *buf, size_t nbytes); -----rea ...

  2. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  3. (转载)网络编程释疑之:同步,异步,阻塞,非阻塞

    一讲到网络编程的I/O模型,总会涉及到这几个概念.问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦.今天 ...

  4. 网络编程释疑之:同步,异步,阻塞,非阻塞

    一讲到网络编程的I/O模型,总会涉及到这几个概念.问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦.今天 ...

  5. linux网络编程--阻塞与非阻塞

    linux网络编程--阻塞与非阻塞 建立连接 接受连接 无阻塞的设置方式 read() write() 读操作 写操作 Linux fcntl函数详解 功能描述 函数原型 fcntl()函数五种功能 ...

  6. C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数

    目录 阻塞与非阻塞定义 send与recv connect 一些问题 为什么要将监听socket设置为非阻塞 阻塞与非阻塞定义 阻塞模式指的是当前某个函数执行效果未达预期,该函数会阻塞当前的执行线程, ...

  7. Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制

    三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0);       //获取文件的Mode值     fcntl(sockfd, F ...

  8. 【Linux网络编程学习】阻塞、非阻塞、同步、异步以及五种I/O模型

    文章目录 1. 基本概念 1.1 阻塞与非阻塞 1.2 同步与异步 1.3 为什么没有"异步阻塞" 2. 五种IO模型 2.1 阻塞 blocking 2.2 非阻塞 non-bl ...

  9. 网络编程中同步与异步,IO阻塞与非阻塞总结

    IO操作分两个阶段 第1个阶段:等待数据准备好(从外部设备磁盘或网络读到内核缓冲区): 第2个阶段:采用系统调用(内核进程),操作系统内核将数据从内核缓冲区读到用户空间. 第1阶段花费的时间远远大于第 ...

  10. Linux网络编程之阻塞与非阻塞

    文章目录 第1关:阻塞 第2关:非阻塞 第3关:阻塞与非阻塞切换 第1关:阻塞 #include <sys/socket.h> // 包含套接字函数库 #include <fcntl ...

最新文章

  1. vue - package.json
  2. 深入浅出:对MySQL主从配置的一些总结
  3. UA MATH566 统计理论1 充分统计量
  4. 1过程流程图 3 apqp_如何绘制流程图?这里有3种绘制方法,既简单又高效!1分钟可学会...
  5. 高质量C++/C编程指南(林锐)
  6. 动态规划经典算法--最长公共子序列 LCS
  7. C#并行编程(3):并行循环
  8. java 注解开发 解耦_Java提升七:注解
  9. Atitit 得到mybatis 实际 sql 1.1. 使用mybatis工具提供的,只能出现问号一大堆不行 1 1.2. 配置log 打印sql依然不行,里面有问号。。 4 1.3. 配置p
  10. 数据应用apply练习
  11. 【SOT】SiamFC代码笔记
  12. PC端如何跟手机端兼容
  13. 路畅畅云固件升级教程_【图】E-Link功能/智能语音 路畅畅云+车载导航评测_汽配中国网...
  14. 【redis客户端登录】
  15. R语言之几大常见概率分布
  16. 如何用 js 获取虚拟键盘高度?- 20170817 前端开发日报
  17. 潮流话机直接对接讯时FXO
  18. Python爬取有道翻译(破解加密--js加密)!
  19. matlab处理时间数据绘图
  20. ADC前BUFFER(跟随器)作用

热门文章

  1. 为什么红黑树查询快_为什么要有红黑树?什么是红黑树?画了20张图,看完这篇你就明白了...
  2. 欧空局:SNAP and the Sentinel Toolboxes下载网址
  3. python实现DES加密解密
  4. 在Linux中禅道的安装流程
  5. 【IJCAI 2022】参数高效的大模型稀疏训练方法,大幅减少稀疏训练所需资源
  6. 孔子称他为贤,孟子尊他为圣,柳下惠何德何能?2700年家谱揭露真相
  7. 中国医疗信息化建设“十四五”规划分析及投资前景预测报告2022-2028年版
  8. 美团笔试题解2022-3-12号
  9. Oracle loap函数,oracle分区表执行计划
  10. 什么是发动机号,发动机号码是什么?