青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

T9的空間

You will never walk alone!

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  69 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
這一章會讓你想起一些塵封的記憶
上大學的時候,教C語言的老師會教大家文件IO,那個時候講的都是標準輸入輸出,都是C庫的實現,和第三章Unbuffered IO要區別開來,目的之前講過
減少System Call的調用次數,提高Performance
Java上也有類似的實現,只不過Java的實現會更加Common一些,類似BufferedInputStream/BufferedOutputStream,介質則分為很多種,例如FileInputStream
Android Bionic C Lib跟其他C Lib一樣樣子都是類似 FILE* 里面會封裝上管理流所需要的信息: 真正IO操作的file descriptor;緩沖區指針和大小...

對于緩沖一般
stderr是不帶緩沖的
如果是終端設備則是行緩沖,否則是全緩沖
然后這里會順帶提到freopen,這個東西會讓你想到你啟蒙的時光,略表想念,讀了一下Bionic 中 freopen的實現貼在下面
#include <sys/types.h>
#include 
<sys/stat.h>
#include 
<fcntl.h>
#include 
<errno.h>
#include 
<unistd.h>
#include 
<stdio.h>
#include 
<stdlib.h>
#include 
"local.h"

/*
 * Re-direct an existing, open (probably) file to some other file.
 * ANSI is written such that the original file gets closed if at
 * all possible, no matter what.
 
*/

FILE 
*
freopen(
const char *file, const char *mode, FILE *fp)
{
    
int f;
    
int flags, isopen, oflags, sverrno, wantfd;

    
if ((flags = __sflags(mode, &oflags)) == 0{
        
//做(r,w,+)到(O_RDONLY,O_WRONLY,O_RDWR,O_TRUNC)的轉換.
        (void) fclose(fp);
        
return (NULL);
    }


    
if (!__sdidinit)
        __sinit();

    FLOCKFILE(fp);

    
/*
     * There are actually programs that depend on being able to "freopen"
     * descriptors that weren't originally open.  Keep this from breaking.
     * Remember whether the stream was open to begin with, and which file
     * descriptor (if any) was associated with it.  If it was attached to
     * a descriptor, defer closing it; freopen("/dev/stdin", "r", stdin)
     * should work.  This is unnecessary if it was not a Unix file.
     
*/

    
if (fp->_flags == 0{
        fp
->_flags = __SEOF;    /* hold on to it */
        isopen 
= 0;
        wantfd 
= -1;
    }
 else {
        
/* flush the stream; ANSI doesn't require this. */
        
if (fp->_flags & __SWR)
            (
void) __sflush(fp);
        
/* if close is NULL, closing is a no-op, hence pointless */
        isopen 
= fp->_close != NULL;
        
if ((wantfd = fp->_file) < 0 && isopen) {
            (
void) (*fp->_close)(fp->_cookie);
            isopen 
= 0;
        }

    }

    
//對fp做一些clean的動作

    
/* Get a new descriptor to refer to the new file. */
    f 
= open(file, oflags, DEFFILEMODE);
    
//DEFFILEMODE默認為RWRWRW
    
    
if (f < 0 && isopen) {
        
/* If out of fd's close the old one and try again. */
        
if (errno == ENFILE || errno == EMFILE) {
            (
void) (*fp->_close)(fp->_cookie);
            isopen 
= 0;
            f 
= open(file, oflags, DEFFILEMODE);
        }

    }

    sverrno 
= errno;

    
/*
     * Finish closing fp.  Even if the open succeeded above, we cannot
     * keep fp->_base: it may be the wrong size.  This loses the effect
     * of any setbuffer calls, but stdio has always done this before.
     
*/

    
if (isopen && f != wantfd)
        (
void) (*fp->_close)(fp->_cookie);
    
if (fp->_flags & __SMBF)
        free((
char *)fp->_bf._base);
    fp
->_w = 0;
    fp
->_r = 0;
    fp
->_p = NULL;
    fp
->_bf._base = NULL;
    fp
->_bf._size = 0;
    fp
->_lbfsize = 0;
    
if (HASUB(fp))
        FREEUB(fp);
    _UB(fp)._size 
= 0;
    WCIO_FREE(fp);
    
if (HASLB(fp))
        FREELB(fp);
    fp
->_lb._size = 0;

    
if (f < 0{            /* did not get it after all */
        fp
->_flags = 0;        /* set it free */
        FUNLOCKFILE(fp);
        errno 
= sverrno;    /* restore in case _close clobbered */
        
return (NULL);
    }


    
/*
     * If reopening something that was open before on a real file, try
     * to maintain the descriptor.  Various C library routines (perror)
     * assume stderr is always fd STDERR_FILENO, even if being freopen'd.
     
*/

    
if (wantfd >= 0 && f != wantfd) {
        
if (dup2(f, wantfd) >= 0{
            (
void) close(f);
            f 
= wantfd;
        }

    }


    fp
->_flags = flags;
    fp
->_file = f;
    fp
->_cookie = fp;
    fp
->_read = __sread;
    fp
->_write = __swrite;
    fp
->_seek = __sseek;
    fp
->_close = __sclose;

    
/*
     * When opening in append mode, even though we use O_APPEND,
     * we need to seek to the end so that ftell() gets the right
     * answer.  If the user then alters the seek pointer, or
     * the file extends, this will fail, but there is not much
     * we can do about this.  (We could set __SAPP and check in
     * fseek and ftell.)
     
*/

    
if (oflags & O_APPEND)
        (
void) __sseek((void *)fp, (fpos_t)0, SEEK_END);
    FUNLOCKFILE(fp);
    
return (fp);
}


這里以w or a+之類創建文件的時候沒辦法指定access mode,C lib就沒開這種接口,應該就是默認行為,linux上應該就是unmask后的值,猜想這也與各大平臺差異太大,沒辦法在C lib上做wrap吧.

這個時候做作業吧,++困...沉下心來,做完...

5.1 setvbuf 實現 setbuf
Bionic庫也是這樣做的 setvbuf(fp, buf, buf ? _IOFBF : _IONBF, BUFSIZ)

5.2
fgets, fputs
這兩個雖熱是和行緩沖相關的函數,但要注意的是fgets讀數據讀到行末or緩沖區滿為止,always會給留一個字符給null; fputs也是將緩沖區內容全部輸出,并不care是否有換行符。

5.3 printf返回值是0意味著什么也沒輸出,輸出為空。

5.4 getchar()返回的是int不是char...EOF通常會被定義為 -1 如果char是一個U8,那么就會陷入死循環。

5.5 要在標準IO上使用fsync,先fflush流,把buffer從userspace都寫到kernel,然后用fileno拿到fd,fsync(fd)就好了

5.6 這里要說的是,一般情況下(除開輸入輸出設備)行緩沖,fputs中沒有換行符后續不fflush,fgets應該是讀不到的。
posted on 2013-05-28 19:24 Torres 閱讀(311) 評論(0)  編輯 收藏 引用 所屬分類: APUE
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产亚洲精品激情久久| 欧美性猛交视频| 噜噜噜在线观看免费视频日韩| 中文网丁香综合网| 亚洲调教视频在线观看| 亚洲天堂网站在线观看视频| 一本久道综合久久精品| 亚洲在线观看免费| 欧美影院在线播放| 久久综合久久综合九色| 欧美电影免费观看高清| 亚洲精品一区二区三区在线观看| 日韩午夜激情电影| 亚洲欧美国产制服动漫| 亚洲专区国产精品| 欧美日韩亚洲网| 国产精品永久| 在线观看日韩av电影| 亚洲美女黄色片| 欧美中文字幕视频在线观看| 欧美国产极速在线| 一本色道久久88综合日韩精品| 午夜精品久久久久久久99热浪潮| 久久激情中文| 欧美性大战久久久久久久蜜臀| 国产一区二区成人久久免费影院| 亚洲黄页一区| 欧美亚洲午夜视频在线观看| 欧美成人一区二区三区| 久久av红桃一区二区小说| 欧美fxxxxxx另类| 亚洲视频一二三| 麻豆免费精品视频| 国产日韩欧美在线| 亚洲私人影院| 亚洲韩国青草视频| 欧美一区二区黄| 欧美日韩mp4| 激情国产一区| 亚洲欧美精品中文字幕在线| 欧美国产高清| 久久riav二区三区| 国产精品三上| 亚洲五月六月| 亚洲福利在线观看| 欧美视频在线一区二区三区| 久久久久久久性| 亚洲国产欧美日韩另类综合| 亚洲性线免费观看视频成熟| 久久夜色撩人精品| 国产视频在线观看一区二区三区| 亚洲视频在线一区| 亚洲国产影院| 久久先锋影音| 在线观看日韩一区| 欧美**人妖| 久久久国产成人精品| 国产欧美精品国产国产专区| 亚洲免费在线视频一区 二区| 日韩亚洲欧美一区| 欧美理论电影网| 亚洲精品国精品久久99热| 亚洲黄页一区| 伊人精品久久久久7777| 亚洲黄一区二区| 久久精品夜色噜噜亚洲a∨| 国产精品99久久久久久久vr| 欧美日韩蜜桃| 亚洲夜间福利| 亚洲一区二三| 国产亚洲精品资源在线26u| 久久精品一级爱片| 久久久久网址| 最新中文字幕一区二区三区| 亚洲国产一二三| 欧美日韩美女在线观看| 亚洲欧美久久久| 欧美在线网址| 91久久久亚洲精品| 99pao成人国产永久免费视频| 欧美亚洲成人免费| 久久av在线| 久久久噜噜噜久久| 欧美四级电影网站| 国产精品一区二区三区久久 | 欧美激情a∨在线视频播放| 欧美成人精品在线播放| 亚洲欧洲在线观看| 日韩午夜在线观看视频| 国产精品日韩一区| 狂野欧美激情性xxxx| 欧美成va人片在线观看| 亚洲午夜日本在线观看| 久久国产精品72免费观看| 亚洲精品国产系列| 亚洲综合精品四区| 欧美日韩免费一区二区三区| 欧美午夜a级限制福利片| 亚洲国产乱码最新视频| 亚洲精品激情| 国产精品一区在线播放| 欧美成人精品在线观看| 欧美少妇一区| 久久综合九色综合欧美狠狠| 欧美日韩直播| 老鸭窝亚洲一区二区三区| 欧美日韩中国免费专区在线看| 久久久噜噜噜久久| 国产精品久久九九| 亚洲国产日日夜夜| 好看不卡的中文字幕| 中文日韩在线视频| 日韩视频免费| 久久婷婷久久| 欧美在线电影| 欧美系列亚洲系列| 欧美激情视频在线播放| 国产主播精品在线| 亚洲视频综合在线| 亚洲特级毛片| 欧美精品入口| 欧美激情精品久久久久久| 国产亚洲电影| 一区二区三区精品| 亚洲视频观看| 欧美日韩亚洲另类| 最近中文字幕日韩精品| 亚洲高清自拍| 久久一区二区三区四区| 久久精品一区四区| 国产一区二区三区四区| 香蕉国产精品偷在线观看不卡| 亚洲一级黄色av| 欧美日韩中文字幕在线视频| 亚洲日本成人| 一卡二卡3卡四卡高清精品视频| 午夜视频在线观看一区二区三区| 亚洲午夜国产一区99re久久| 136国产福利精品导航| 亚洲一区观看| 午夜视频在线观看一区二区| 亚洲日本aⅴ片在线观看香蕉| 国产农村妇女毛片精品久久麻豆 | 欧美亚洲三级| 国语自产偷拍精品视频偷| 日韩午夜在线观看视频| 日韩一级大片在线| 欧美激情网友自拍| 亚洲日本中文字幕免费在线不卡| 91久久久久久| 欧美高清视频免费观看| 亚洲精品国产精品国自产在线 | 国产精品视频久久久| 一区二区三区国产在线| 午夜天堂精品久久久久| 国产视频亚洲| 美女网站在线免费欧美精品| 亚洲国产精品v| 亚洲午夜国产成人av电影男同| 国产精品mm| 欧美在线观看一区| 欧美成人精品在线| 一区二区三区视频在线观看 | 一级成人国产| 国产精品乱码一区二三区小蝌蚪 | 欧美一区影院| 91久久夜色精品国产九色| 欧美日韩精品在线观看| 午夜精品久久久久久久久久久| 久久综合久久美利坚合众国| 日韩视频在线观看国产| 国产精品视频一区二区高潮| 久久久久久久999精品视频| 亚洲精品欧美激情| 久久久久久有精品国产| 亚洲精品小视频| 国产日韩欧美综合| 欧美福利视频在线观看| 亚洲欧美日韩视频一区| 你懂的国产精品| 亚洲在线视频观看| 亚洲国产成人不卡| 国产酒店精品激情| 欧美日韩国产精品自在自线| 久久精品91久久久久久再现| 一本久道综合久久精品| 欧美激情第9页| 久久爱另类一区二区小说| 99爱精品视频| 亚洲国产精品成人精品| 国产麻豆一精品一av一免费| 欧美国产欧美亚洲国产日韩mv天天看完整 | 最新国产の精品合集bt伙计| 午夜久久福利| 亚洲日本va午夜在线电影| 国产在线不卡精品| 国产精品成人va在线观看| 欧美成人中文| 久久综合久久久久88| 久久国产福利|