Linux系统编程:验证kernel内核缓存区大小->4096字节
使用的API
read/write函数 常常被称为Unbuffered IO。指的是无用户缓存区。但不保证不使用内核缓存区。我们可以用来验证内核缓存区的大小是不是4096字节。这里我们还用一个系统函数 dup2 文件描述符重定向函数,来实现 从终端输入 直接输出到文件中。
验证内核缓存区大小
思路很简单,就是测试4096这个临界点。
首先往文件中写4096个字节,查看数据是否写入到磁盘文件,从终端读入数据,缓存区4096数据是否写到磁盘文件。
代码
-
#include <stdio.h>
-
#include <string.h>
-
#include <unistd.h>
-
#include <fcntl.h>
-
-
int main(void)
-
{
-
int fd =
open(
"temp.txt",O_RDWR|O_CREAT|O_TRUNC,
0664);
-
char temp[
1024]={
0};
-
dup2(fd,STDOUT_FILENO);
-
//文件重定向后,往终端输出的数据,会写入的文件中
-
//先写4096B试试,看看能写入磁盘不
-
for(
int i =
0; i <
4096;i++)
-
{
-
printf(
"%c",
48);
-
}
-
//kernel缓存区大小为4096!写到4097字节,缓冲区溢出才会将缓冲区内容写道磁盘文件,
-
//缓存区继续放数据
-
while(
1)
-
{
-
//读取终端数据
-
read(STDIN_FILENO,temp,
sizeof(temp));
-
if(
strncmp(temp,
"exit",
4)==
0)
-
break;
-
printf(
"%s\n",temp);
-
}
-
close(fd);
-
return
0;
-
}
启动程序查看文件数据
程序启动,写入4096字节,但是文件数据却没有
终端写入数据并查看
退出程序及验证结果
验证结果,写到4097个字节,内核缓存区要溢出了,才将缓冲区内容写到磁盘中去,再将数据写到内核缓存区,等待下一次缓存区满或者文件关闭 才会将缓存区内容写到磁盘。
</article>
<textarea class="comment-content" name="comment_content" id="comment_content" placeholder="请发表有价值的评论, 博客评论不欢迎灌水,良好的社区氛围需大家一起维护。" maxlength="1000"></textarea>
<div class="comment-emoticon"><img class="comment-emoticon-img" data-url="https://csdnimg.cn/release/blogv2/dist/pc/img/" src="https://csdnimg.cn/release/blogv2/dist/pc/img/emoticon.png" alt="表情包"></div>
<span class="comment-emoticon-tip">插入表情</span>
<div class="comment-emoticon-box" style="display: none;">
<div class="comment-emoticon-img-box"></div>
</div>
<div class="opt-box">
<div id="ubbtools" class="add_code">
<a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
</div>
<input type="hidden" id="comment_replyId" name="comment_replyId">
<input type="hidden" id="article_id" name="article_id" value="79811223">
<input type="hidden" id="comment_userId" name="comment_userId" value="">
<input type="hidden" id="commentId" name="commentId" value="">
<div class="dropdown" id="myDrap">
<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<div class="txt-selected text-truncate">添加代码片</div>
<svg class="icon d-block" width="200px" height="100.00px" viewBox="0 0 2048 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M597.33333292 298.666667h853.333334L1023.99999992 725.333333 597.33333292 298.666667z"></path></svg>
</a>
<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
<li><a data-code="html">HTML/XML</a></li>
<li><a data-code="objc">objective-c</a></li>
<li><a data-code="ruby">Ruby</a></li>
<li><a data-code="php">PHP</a></li>
<li><a data-code="csharp">C</a></li>
<li><a data-code="cpp">C++</a></li>
<li><a data-code="javascript">JavaScript</a></li>
<li><a data-code="python">Python</a></li>
<li><a data-code="java">Java</a></li>
<li><a data-code="css">CSS</a></li>
<li><a data-code="sql">SQL</a></li>
<li><a data-code="plain">其它</a></li>
</ul>
</div>
<div class="right-box" id="rightBox" data-type="2">
<span id="tip_comment" class="tip">还能输入<em>1000</em>个字符</span>
<a data-report-click="{"mod":"1582594662_003","spm":"1001.2101.3001.4227","ab":"new"}"><input type="submit" class="btn btn-sm btn-comment" value="发表评论"></a>
</div>
</div>
</form>
<input type="button" class="bt-comment-show" value="评论">
</div>
<div class="comment-list-container">
<a id="comments"></a>
<div class="comment-list-box"></div>
<div id="commentPage" class="pagination-box d-none" style="display: block;"></div>
</div>
每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小。当应用程序调用write时,内核从应用程序进程的缓冲区中拷贝所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据(或是应用程序的缓冲区大于套接口发送缓冲区,或是套接口发送缓冲区还有其他数据),应用进程将被…
(1)实验与尝试
测试环境: vmware虚拟机 centos7系统。
服务端建立连接后睡眠,应用层不接受任何数据,只有内核接受缓冲区才接受数据。
服务端代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<…
count:缓冲区大小
返回值:
0:读到文件末尾。
成功; > 0 读到的字节数。
失败: -1, 设置 errno
-1: 并且 errno = EAGIN 或 EWOULDBLOCK, 说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。
…
#define LOG_ALIGN alignof(struct printk_log)
#define _
UNIX的传统 是Everything is a file,键盘、显示器、串口、磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存在磁盘上的文件)一样打开、读、写和关闭,使用的函数接口是相同的。用户程序调用C标准I/O库函数读写普通文件或设备,而这些库函数要通过系统调用把读写请求传给内核
,最终由内
a)带缓冲区文件操作:高级标准文件I/O操作(eg:C库定义的fwrite和fread已经printf函数),将会在用户空间中自动为正在使用的文件开辟内存缓冲区。
b)非缓冲区文件操作:低级文件I/O操作(eg:系统接口read和write),读写文件时,不会开辟对文件操作…
flags: 打开文件时,可以传入多个参数选项,用下
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1)
热门文章
分类专栏
最新评论
您愿意向朋友推荐“博客详情页”吗?
-
强烈不推荐
-
不推荐
-
一般般
-
推荐
-
强烈推荐
qq_281617953: 肯定的,堆内空间, new char没释放
weixin_45563430: 谢谢你 成功解决,我觉得Android Studio的很多设计有点反人类,影响安卓开发。至少新手是这么觉得的
A913134367: 这个时候的我书上还没写到DX求和寄存器呢.................我用的ES做了俩次loop
yyt666666: 我的 Windows10系统在这个地址才找到,应该是版本不同了 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
萋: 怎么实现判断错误呢