linux 非緩沖io筆記

簡介

在linux中,打開的的文件(可輸入輸出)標識就是一個int值,如下面的三個標準輸入輸出
STDIN_FILENO/STDOUT_FILENO/STDERR_FILENO這三個是標準輸入輸出,對應0,1,2

open(文件路徑,讀寫標識,其它不定參數)
read(文件標識,緩沖區,要讀的字節數):從文件中讀取指定的字節數到緩沖區,返回值為實際讀取的字節
write(文件標識,緩沖區,要寫的字節數):將緩沖區中指定的字節數寫入到文件中
close(文件標識):關閉文件
讀寫標識,常用的有O_RDONLY,O_WRONLY,O_RDWR,O_APPEND,O_TRUNC

lseek(文件標識,偏移量,偏移起始位置),其中偏移的起始位置有三個:
SEEK_SET:文件頭
SEEK_CUR:當前位置
SEEK_END:文件尾

例1

#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>

struct people{
    const char name[10];
    int age;
};

int main(){
    int fd;
    if((fd=open("./test_file",O_RDWR|O_TRUNC|O_CREAT))<0){
        perror("open file error");
        return -1;
    }
    struct people a={"zhangsan",20},b={"lisi",40},
                  c={"wangwu",50},d={"zhaoliu",60};
    write(fd,&a,sizeof(a));
    write(fd,&b,sizeof(b));
    write(fd,&c,sizeof(c));
    write(fd,&d,sizeof(d));

    printf("input your choice:");
    int num;
    scanf("%d",&num);
    switch(num){
        case 1:
            lseek(fd,0,SEEK_SET);break;
        case 2:
            lseek(fd,sizeof(struct people),SEEK_SET);break;
        case 3:
            lseek(fd,sizeof(struct people)*2,SEEK_SET);break;
        default:
            lseek(fd,sizeof(struct people)*3,SEEK_SET);
    }

    struct people test;
    if(read(fd,&test,sizeof(struct people))<0){
        perror("read file error");
        return 1;        
    }
    printf("your choice is %s,%d\n",test.name,test.age);
    close(fd);
    return 0;


例子2

dup函數用于將現在的文件標識復制一份給其它人,以達到共享文件的目的
dup2函數與dup作用一樣,但過程不一樣
如果myin、myout已經有對應的文件管道,dup2會將其關閉(如果myin/myout沒初始化會出錯),然后再復制文件標識

#include <unistd.h>
#include <stdio.h>
 
int main(){
    int myin=dup(STDIN_FILENO);
    int myout=dup(STDOUT_FILENO);
    //int myin=myout=0;
    //dup2(STDIN_FILENO,myin);
    //dup2(STDOUT_FILENO,myout);
    char buf[100]={0};
    ssize_t s=read(myin,buf,100);
    write(myout,buf,s);
    return 0; 
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.文件描述符 所有執行I/O操作的系統調用都以文件描述符(一個非負整數)來指代打開的文件。文件描述符用以表示所有...
    666真666閱讀 1,141評論 0 2
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,237評論 2 33
  • 文件操作 (Linux文件操作)) [文件|目錄] Linux文件操作:為了對文件和目錄進程處理,你需要用到系統...
    JamesPeng閱讀 1,501評論 1 5
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • 曾起何時辦事效率的提高讓人感嘆社會的進步也讓人沒有了思量的時間,連后悔的余地都沒有。當一切快得自己都跟不上時才開始...
    a06b93caddc4閱讀 269評論 0 0