<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[nio]noblock的IO到底是啥意思？阻塞是啥意思。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Tue, 26 May 2020 13:16:55 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	man 2 socket&nbsp;&nbsp;&nbsp;&nbsp;#非阻塞的真实含义是没有连接时accept返回-1(Java里返回Null，C语言返回-1)，没有数据时read返回0.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_NONBLOCK&nbsp;&nbsp; Set the O_NONBLOCK file status flag on the new open file description.&nbsp;&nbsp;Using this<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag saves extra calls to fcntl(2) to achieve the same result.&nbsp;&nbsp; #fcntl设置也成。<br/><br/>java里设置：ss.configureBlocking(false);&nbsp;&nbsp;#重点 OS NOBLOCK。<br/>C里：<br/>&nbsp;&nbsp;&nbsp;&nbsp;int listenfd = socket(AF_INET, SOCK_STREAM, 0); <br/>&nbsp;&nbsp;&nbsp;&nbsp;fcntl(listenfd, F_SETFL, O_NONBLOCK); // 设置非阻塞方式<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i&lt;wait_fds; ++i ) // for循环中以进程处理epoll事件,更稳定。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( events[i].data.fd == listenfd )&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connfd = accept( listenfd, (struct sockaddr *)&amp;clientaddr, &amp;clilen );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;accept return listenfd=%d&#92;n&quot;,connfd);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( connfd &lt; 0 )&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;connfd &lt; 0&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 设置非阻塞<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (fcntl( connfd, F_SETFL, fcntl( connfd, F_GETFD, 0)&#124;O_NONBLOCK) == -1)&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>accept、read、write: -1 不会阻塞。默认recv(5...阻塞。NIO在Java里指：<br/>1）Java New：文件和楼socket都封装成新的东西，可以select统一侦听状态。<br/>2）Unix NOBLOCKING。&nbsp;&nbsp;<br/><br/>BLOCKING的缺点弊端：每客户端、每线程【阻塞】。<br/><br/>man 2 accept&nbsp;&nbsp;&nbsp;&nbsp;#此调用在发生错误时返回-1.若成功则返回一个非负整数标识这个 连接套接字.&nbsp;&nbsp;NOBLOCKING -1<br/>man 2 read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#生错误时返回-1,并置 errno 为相应值.在这种情况下无法得知文件偏移位置是否有变化.在读取了一定量的数据后被信号所中断,并返回 -1(且 errno 被设置为EINTR),或者返回已读取的数据量.<br/><br/><br/><br/>1万个连接 1个人发来数据：<br/><br/>accept返回都是-1，来了数据读了一部分后，你又回去处理连接了，数据读不全。于是出现粘包。<br/><br/>但是你在一个循环里，全量遍历O(n)系统调用。<br/><br/>man 2 select:<br/>多少条路、有多少个读的、多少个写的。<br/><br/>select(3,5)&nbsp;&nbsp; # 3有没有连接，5有没有连接。<br/><br/>selec（t3，5，6，7，8，9，10，11）&nbsp;&nbsp; O(1)只需要调一次即可。<br/><br/>accept (3) = 6<br/>recv(5)&nbsp;&nbsp; O(m)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#多路复用只能给你返回状态，程序需要自己调用R/W你的IO&nbsp;&nbsp;，只要自己去读去取就叫同步模型。Netty里全是同步IO模型：无论是在当前线程还是其它线程NIO BIO New IO(指文件、socket一块给弄成一个NewIO），N：还有一个是Noblocking，也就是没来连接时返回-1，读取不到socket数据时返回立即0。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #异步：有阻塞么？没有阻塞的。 调用内核的一个方法（callback)(内核帮你把数据读写）<br/><br/><a href="https://jackxiang.com/attachment.php?fid=590" target="_blank"><img src="https://jackxiang.com/attachment.php?fid=590" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>man 2 epoll_create:<br/>man 2 epoll_ctl<br/><br/><a href="https://jackxiang.com/attachment.php?fid=591" target="_blank"><img src="https://jackxiang.com/attachment.php?fid=591" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><a href="https://jackxiang.com/attachment.php?fid=592" target="_blank"><img src="https://jackxiang.com/attachment.php?fid=592" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="770"/></a><br/><br/><br/><br/>strace -ff -o out ./nginx<br/><br/>
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [nio]noblock的IO到底是啥意思？阻塞是啥意思。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>