精华内容
下载资源
问答
  • 深入理解linux下write()和read()函数

    万次阅读 多人点赞 2017-05-13 20:09:11
    1、write() 函数定义:ssize_t write (int fd, const void * buf, size_t count); 函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。 返回值:如果顺利write()会返回实际写入的字节...

    1、write()

    函数定义:ssize_t write (int fd, const void * buf, size_t count); 

    函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。

    返回值:如果顺利write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错误代码存入errno中。

     

    附加说明:

    (1)write()函数返回值一般无0,只有当如下情况发生时才会返回0:write(fp, p1+len, (strlen(p1)-len))中第三参数为0,此时write()什么也不做,只返回0。man手册给出的write()返回值的说明如下:

    (2)write()函数从buf写数据到fd中时,若buf中数据无法一次性读完,那么第二次读buf中数据时,其读位置指针(也就是第二个参数buf)不会自动移动,需要程序员来控制,而不是简单的将buf首地址填入第二参数即可。如可按如下格式实现读位置移动:write(fp, p1+len, (strlen(p1)-len))。 这样write第二次循环时便会从p1+len处写数据到fp, 之后的也一样。由此类推,直至(strlen(p1)-len)变为0。

    (3)在write一次可以写的最大数据范围内(貌似是BUFSIZ ,8192),第三参数count大小最好为buf中数据的大小,以免出现错误。(经过笔者再次试验,write一次能够写入的并不只有8192这么多,笔者尝试一次写入81920000,结果也是可以,看来其一次最大写入数据并不是8192,但内核中确实有BUFSIZ这个参数,具体指什么还有待研究)

    以下通过一个例子具体说明write函数用法

    #include <string.h>
    #include <stdio.h>
    #include <fcntl.h>
    int main()
    {
      char *p1 = "This is a c test code";
      volatile int len = 0;
    
      int fp = open("/home/test.txt", O_RDWR|O_CREAT);
      for(;;)
      {
         int n;
    
         if((n=write(fp, p1+len, (strlen(p1)-len)))== 0)   //if((n=write(fp, p1+len, 3)) == 0) 
         {                                                 //strlen(p1) = 21
             printf("n = %d \n", n);
             break;
         }
         len+=n;
      }
      return 0;
    }

     

    此程序中的字符串"This is a c test code"有21个字符,经笔者亲自试验,若write时每次写3个字节,虽然可以将p1中数据写到fp中,但文件test.txt中会带有很多乱码。唯一正确的做法还是将第三参数设为(strlen(p1) - len,这样当write到p1末尾时(strlen(p1) - len将会变为0,此时符合附加说明(1)中所说情况,write返回0, write结束。 

    2、read()

    函数定义:ssize_t read(int fd, void * buf, size_t count);

    函数说明:read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。

    返回值:返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据。若参数count 为0, 则read()不会有作用并返回0。另外,以下情况返回值小于count:

    (1)读常规文件时,在读到count个字节之前已到达文件末尾。例如,距文件末尾还有50个字节而请求读100个字节,则read返回50,下次read将返回0。

    (2)对于网络套接字接口,返回值可能小于count,但这不是错误,详细解释参考这篇文章https://blog.csdn.net/hhhlizhao/article/details/73912578

     

    注意:read时fd中的数据如果小于要读取的数据,就会引起阻塞。(关于read的阻塞情况评论区有朋友有不同意见,笔者查阅资料后作如下补充。)以下情况read不会引起阻塞:

    (1)常规文件不会阻塞,不管读到多少数据都会返回;

    (2)从终端读不一定阻塞:如果从终端输入的数据没有换行符,调用read读终端设备会阻塞,其他情况下不阻塞;

    (3)从网络设备读不一定阻塞:如果网络上没有接收到数据包,调用read会阻塞,除此之外读取的数值小于count也可能不阻塞,原因见上面链接。

    由于笔者水平有限,文中如有谬误之处还请读者朋友指出,以免误导大家。

    展开全文
  • Mit6.S081-实验6-Copy-on-Write Fork for xv6

    万次阅读 2020-12-30 14:10:41
    Mit6.S081-实验6-Copy-on-Write Fork for xv6一、前言二、The problem三、The solution四、Implement copy-on write1,实验要求2,进攻计划3,一些提示4,具体实现5,执行效果 一、前言 虚拟内存提供一定程度的...

    一、前言

    虚拟内存提供一定程度的重定向:kernel可以通过标记PTEs无效、只读(导致page faults)来中断内存引用;
    kernel也可以通过改变地址含义(通过更改PTES)。
    在电脑系统中有个说法:系统问题可以通过一定程度的重定向解决。
    lazy allocation lab提供了一个例子。这个lab探索另外的例子:copy-on write fork。
    

    开始本lab前,先切换到cow分支

       git fetch、git checkout cow、make clean
    

    二、The problem

    xv6中的fork() system call,复制parent进程所有的用户空间内存到child。
    如果parent是非常大的,copying将花费很长时间。糟糕的是,这个工作通常是大量浪费的;
    例如,fork()后紧接着是exec()在child进程中,这将导致child会丢弃拷贝的内存,可能绝大多数都不使用。
    另一方面,如果parent和child使用一个page,并且其中一个或两个写,那么确实需要一个副本。
    

    三、The solution

    copy-on-write(COW)fork()的目的是:推迟对child的分配和拷贝物理内存页,直到拷贝确实需要。
    COW fork()仅仅给child创建一个pagetable,其用户内存的PTES指向parent的物理页。
    COW fork()标记parent和child的所有用户内存PTES是不可写的。
    当某个进程尝试写其中一个COW页时,cpu将强制一个page fault。
    kernel page-fault handler检测这种情形,为faulting进程分配一页物理内存,复制原始页到新页,
    更改faulting进程相关PTE来指向新页,这次让PTE标记为可写。当page fault handler返回时,用户进程将能够向拷贝页写入。
    COW fork()让物理页(实现用户内存)的释放更有技巧性。
    一个给定物理页可能被多个进程的page table指向,仅应该在最后的指向消失时,才释放物理页。
    

    四、Implement copy-on write

    1,实验要求

    你的任务是在xv6 kernel实现copy-on fork。如果更改的kernel code通过cowtests和usertests,则成功了。
    为了帮你测试你的实现,我们已经提供了一个xv6程序(cowtest,源码在user/cowtest.c)。
    cowtest运行多个tests,未改xv6时第一个就会失败。因此初始化,你将看到:
    

    在这里插入图片描述

    “simple” test分配可用内存的一半多,然后fork()s。因为没有足够的空闲物理内存,来给child一个完整parent内存拷贝,所以fork失败。
    当你完成时,你的kernel应该通过cowtest和usertests中的所有测试:
    

    在这里插入图片描述

    2,进攻计划

    1.	更改uvmcopy()来映射parent物理页到child,而不是分配新页。清除parent和child PTES的PTE_W。
    2.	更改usertrap()来识别page faults。
        当一个page-fault发生在一个COW page,通过kalloc()分配一个新页,复制旧页到新页,并且安装新页到PTE(设置PTE_W)。
    3.	确保每个物理页被释放,当最后的PTE指向移除时。
        这么做的一个好方式是:对每个物理页保存一个“reference count”,表明指向此物理页的page table数量。
        设置page的reference数目为1,当kalloc()分配它时。
        增加page的reference数目,当fork导致child分享此页时;减少page的reference数目,每次任意进程从page table中删除此page时。
        kfree()应该仅仅放置一个page在free list最后,如果它的reference数目为0。
        将这些计数放到一个固定长度的整数数组中。你将不得不找出一个计划:如何索引数组,如何选择它的尺寸。
        例如:你可以用页物理地址除以4096对数组进行索引,并给数组一些元素,这些元素,通过kalloc.c中的kinit()放在free list中的页
    4.	当遇到一个COW page时,更改copyout(),使用与page fault相同的方法。
    

    3,一些提示

    1.	lazy page allocation lab可能已经让你熟悉了一些xv6 kernel代码(与copy-on-write相关的)。
        然而,你不应该让本实验基于lazy allocation的方案。而是根据上面引导的,开始一个新的xv6拷贝。
    2.	使用RISC-V PTE的预留标志位,来记录每个PTE是不是一个COW映射,这可能是有用的。
    3.	usertests探索一些cowtest没有测试到的地方,不要忘记核对两个测试都通过。
    4.	一些对页表标志位有帮助的宏指令和定义在kernel/riscv.h下面。
    5.	如果一个COW page fault发生,但没有空闲内存,此进程应该被杀掉。
    

    4,具体实现

    1)修改kernel/vm.c,新增int refNum[32768];来记录关联物理页的页表数量。32768是根据(PHYSTOP-KERNBASE)/PGSIZE得出。
    在这里插入图片描述
    2)修改kernel/riscv.h,新增PTE_COW标志位。
    在这里插入图片描述
    参考riscv对PTE标志位定义,第9-10位为预留标志位。
    在这里插入图片描述

    3)修改kernel/vm.c的uvmcopy(),让进程fork时,不赋值物理页,而是child进程页表指向parent进程的物理页,但标记要将parent和child的PTE都清除PTE_W标志位,并添加COW标志位,表明两个PTE指向一个物理页。
    在这里插入图片描述
    4)修改kernel/vm.c的mappages(),在页表与物理页绑定时,增加refNum对应元素计数。
    在这里插入图片描述
    5)修改kernel/vm.c的uvmunmap(),在页表与物理页解绑时,减少refNum对应元素计数,当refNum==1即仅kernel pagetable持有时,释放内存。
    在这里插入图片描述
    6)将kernel/vm.c中walk()定义在defs.h中。
    在这里插入图片描述
    7)修改kernel/trap.c的usertrap(),引入refNum,在发生page fault时,若该虚拟地址关联的PTE,表明关联的物理页是一个COW页,则新申请一个物理页,让此虚拟地址指向新物理页,并修改refNum计数。
    在这里插入图片描述
    在这里插入图片描述
    8)修改kernel/vm.c的copyout(),同kernel/trap.c的usertrap。
    在这里插入图片描述

    5,执行效果

    运行xv6后,执行cowtest测试本实验
    在这里插入图片描述
    执行usertests回归测试
    在这里插入图片描述

    展开全文
  • Write-through, write-around and write-back cache There are three main caching techniques that can be deployed, each with their own pros and cons.  Write-through cache directs write I/O onto c
    Write-through, write-around and write-back cache

    There are three main caching techniques that can be deployed, each with their own pros and cons.

        Write-through cache directs write I/O onto cache and through to underlying permanent storage before confirming I/O completion to the host. This ensures data updates are safely stored on, for example, a shared storage array, but has the disadvantage that I/O still experiences latency based on writing to that storage. Write-through cache is good for applications that write and then re-read data frequently as data is stored in cache and results in low read latency.
        Write-around cache is a similar technique to write-through cache, but write I/O is written directly to permanent storage, bypassing the cache. This can reduce the cache being flooded with write I/O that will not subsequently be re-read, but has the disadvantage is that a read request for recently written data will create a “cache miss” and have to be read from slower bulk storage and experience higher latency.
        Write-back cache is where write I/O is directed to cache and completion is immediately confirmed to the host. This results in low latency and high throughput for write-intensive applications, but there is data availability exposure risk because the only copy of the written data is in cache. As we will discuss later, suppliers have added resiliency with products that duplicate writes. Users need to consider whether write-back cache solutions offer enough protection as data is exposed until it is staged to external storage. Write-back cache is the best performing solution for mixed workloads as both read and write I/O have similar response time levels.
    展开全文
  • 今天redis服务被报出错误:NOWRITE You can’t write against a non-write redis.] with root cause 详细代码如下: 2019-03-20 11:27:30 [ERROR] [org.apache.juli.logging.DirectJDKLog:182] - Servlet.service...

    今天redis服务被报出错误:NOWRITE You can’t write against a non-write redis.] with root cause
    详细代码如下:

    2019-03-20 11:27:30 [ERROR] [org.apache.juli.logging.DirectJDKLog:182] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: NOWRITE You can't write against a non-write redis.] with root cause 
    io.lettuce.core.RedisCommandExecutionException: NOWRITE You can't write against a non-write redis.
    	at io.lettuce.core.protocol.AsyncCommand.completeResult(AsyncCommand.java:118)
    	at io.lettuce.core.protocol.AsyncCommand.complete(AsyncCommand.java:109)
    	at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:598)
    	at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:556)
    	at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:508)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    	at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    	at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
    	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480)
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442)
    	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:748)
    
    

    原因:
    阿里云的redis过期,被禁用了,redis过期不会直接停止,先会被禁用
    在这里插入图片描述

    解决办法:
    解决到控制台进行续费,就可以解决问题

    展开全文
  • write.table() | write.csv() | write.csv2() of R

    千次阅读 2020-04-15 16:10:02
    write.table(x, file = “”, append = FALSE, quote = TRUE, sep = " ", eol = “\n”, na = “NA”, dec = “.”, row.names = TRUE, col.names = TRUE, qmethod = c(“escape”, “double”), fileEncoding = ...
  • FD_WRITE触发条件

    千次阅读 2020-08-26 21:37:46
    FD_WRITE触发条件:1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件2.server通过accept(WSAAccept)接受client连接请求时,在server端会触发FD_WRITE事件3.send(WSASend...
  • nandwrite 参数

    千次阅读 2019-03-28 16:06:40
    转载地址:... $ nandwrite -h nandwrite: invalid option -- 'h' Usage: nandwrite [OPTION] MTD_DEVICE [INPUTFILE|-] Writes to the specified MTD device....
  • HttpContext.Current.Response.Write和Response.Write的意思其实都是一样的都是页面输出,存储在浏览器。 不同点 Response.Write只能在.aspx的page后台使用。 HttpContext.Current.Response.Write则是在类库,接口等...
  • write函数过程解析 __write_nocancel

    千次阅读 2017-07-26 11:08:19
    write函数过程解析 write函数作为用户向终端或者文件进行写数据的重要函数,有着重要的作用。 |------| |---------| |---------| |----------|  | write |----->|sys_write|-------->|vfs_write|------->|ext...
  • 首先解释一下PrintWriter = response.getWriter(); wirte()是类PrintWriter提供的一个方法,是发送请求内容至页面,ajax常用到这个 request.getWriter()返回PrintWriter对象,在调用它的writer...resphonse.write
  • Cache写机制:Write-through与Write-back

    千次阅读 2017-09-21 10:37:32
    无论是Write-through还是Write-back都可以使用写缺失的两种方式之一。只是通常Write-back采用Write allocate方式,而Write-through采用No-write allocate方式;因为多次写入同一缓存时,Write allocate配合Write-...
  • fread/write和 fwrite/write的区别

    千次阅读 2019-05-10 19:39:57
    2、fwrite属于库函数,write属于系统掉头 3、fread可以读一个机构,read在Linux/unix中读二进制与普通文件没有区别 4、fopen不能指定要创建文件的权限,open可以指定权限 5、fopen返回指针,open返回文件描述符...
  • write drain

    千次阅读 2014-12-23 21:12:36
    之前的内存控制器将写缓冲在一个写队列中来允许读请求充分利用内存总吸纳,当写队列满时,或者达到某一个水位,内存调度其就或切换到write drain模式,这时它清空写队列【可能完全清空,也可能清空到某个程度】 在这...
  • nand write会计算ECC并将其烧录到oob中。 nand write.yaffs不计算ECC,因为yaffs image中自带了含ECC的OOB数据,直接将其烧录到oob区即可。
  • 在ARM开发板上跑如下测试程序的时候会概率性出现“Write Failed Bad address”: /* Write test */ #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #...
  • fortran write格式

    千次阅读 2017-03-17 16:44:00
    write(*,"(f10.1)",advance="no")A 格式化输出的控制字符非常的丰富,但常用的并不多,一般说来:" I 、F、E、A、X "是最常使用的几个格式,最好把它们都记下来。 Iw[.m]以w个字符的宽度来输出整数,至少输出m个...
  • Android 10+ 适配数据存取权限,WRITE_EXTERNAL_STORAGE no longer provides write access when targeting Android 10+Android 10+ 适配数据存取权限简介方法总结 Android 10+ 适配数据存取权限 你好! 这是你第一次...
  • write系统调用

    千次阅读 2018-03-12 22:49:38
    系统调用write的作用是把缓冲区buf里的前nbytes字节写入与文件描述符filedes相关联的文件中去。它的返回值是实际写出的字节数。如果文件面舒服有错误或者底层设备驱动程序对数据块尺寸比较敏感,该返回值就可能小于...
  • iwrite复制粘贴

    千次阅读 2020-10-21 23:48:32
    1,登录iwrite 登录iwrite 2,打开需要完成的作业 打开作业 3,按<F12>,再按<F1>,打开chrome控制台, 打开chrome控制台 找到Disable JavaScript前面的小方框并选中 关闭JavaScript 不要...
  • Write-back和Write-through区别

    千次阅读 2013-07-09 14:14:01
    Write caching (即write-back)或 write-through write-through意思是写操作根本不使用缓存。数据总是直接写入磁盘。关闭写缓存,可释放缓存用于读操作。(缓存被读写操作共用) Write caching可以提高写操作的...
  • 本文通过实战经验结合原理分析,总结了三种行之有效的方法,并经过大量读者验证,确实能够彻底解决Write failed: Broken pipe问题。 在使用SSH连接远程服务器的时候,如果长时间不操作,再次进入 Terminal 时就会有...
  • Python&OpenCV - 读写(read&write)视频(video) 详解 及 代码

    万次阅读 多人点赞 2013-12-03 00:26:45
    读取(read&write)视频(video) 详解 及 代码 本文地址:http://blog.csdn.net/caroline_wendy/article/details/17084397 OpenCV读取视频, 获得视频的格式, 读取视频的每一帧, 播放控制; 使用VideoCapture()和read...
  • bufferedoutputstream bos.write(bys); 查jdk这个类的write方法有两种 ![图片说明](https://img-ask.csdn.net/upload/201704/10/1491815639_494447.jpg) 没有传byte数组的,这是为什么呢?
  • Stream.Write 与 StreamWriter.Write 的不同

    千次阅读 2014-04-09 16:24:44
    Stream.Write 与 StreamWriter.Write 是我们在向流中写数据时,最常用的方法。下面就详细讲解这两个方法。 一、测试方法是否结果相同 首先看下面两段代码1是StreamWriter.Write 2是Stream.Write: 1 ...
  • 最近用libcurl开源库做了...1,curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpPostWriteBack); HttpPostWriteBack是回调函数指针,需要自己实现原型为:unsigned int HttpPostWriteBack(void *contents, siz...
  • write javaBean error, fastjson version 1.2.47, class xxxx xxxx Caused by: java.lang.NullPointerException: null 最终发现是该类的某个get方法出现了空指针异常导致了上面的问题,这个就...
  • bean:write用法

    千次阅读 2018-12-28 15:03:39
    bean:write&amp;amp;amp;amp;amp;gt;是什么 &amp;amp;amp;amp;amp;lt;bean:write&amp;amp;amp;amp;amp;gt;是struts标签中bean中的一种,&amp;amp;amp;amp;amp;lt;bean:write name=“key”&amp;...
  • document中的write用法

    万次阅读 2018-08-28 20:07:02
    一、document.write()运行原理  首先我们先了解一下这条语句运行的原理:  document.write()是Javascript中对document.open()所开启的文档流操作的API方法。  它能够直接砸文档流中写入字符串,一旦文档流已经...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 368,788
精华内容 147,515
关键字:

write