1. 程式人生 > >系統呼叫——open、write、read和close

系統呼叫——open、write、read和close

一、檔案描述符
每一個程序都有一個與之相關的檔案描述符,它們是一些小值整數,我們可以通過這些檔案描述符來訪問開啟的檔案。
一般地,一個程式開始執行時,會自動開啟3個檔案描述符:
0——–標準輸入———-stdin
1——–標準輸出———-stdout
2——–標準錯誤———-stderr

二、write系統呼叫

1.write系統呼叫的原型:

#include <unistd.h>

size_t write(int flides, const void *buf, size_t nbytes);

write系統呼叫,是把快取區buf中的前nbytes位元組寫入到與檔案描述符flides有關的檔案中,write系統呼叫返回的是實際寫入到檔案中的位元組數

2.舉例,將一串字元寫入到標準輸入、輸出裡

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int real_num = write(1,"here is my word\t",17);
    if(real_num!=16)//沒有錯誤,只是為了方便檢視寫成16
    {
        write(1,some error);
        //write(0,some error)
        //如果寫入到標準輸入裡,程式結束時會自動將標準輸入裡的內容輸出
} exit(0); }

在Linux上的執行結果:
這裡寫圖片描述

三、read系統呼叫

read系統呼叫的原型:

#include <unistd.h>

size_t read(int flides, void *buf, size_t nbytes);

read系統呼叫,是從與檔案描述符flides相關聯的檔案中讀取前nbytes位元組的內容,並且寫入到資料區buf中。read系統呼叫返回的是實際讀入的位元組數

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() { char buf[128] = {0}; int real_num; real_num = read(0,buf,128); if(real_num==-1)//讀取失敗 { write(2,"a error happened\n",17); } else { write(1,"succuss",7); } exit(0); }

執行結果:
這裡寫圖片描述

四、open系統呼叫
在上面的write和read中,我們使用的檔案描述符是自程式執行就有了的3個檔案描述符,那麼接下來open就可以建立新的檔案描述符,供write和read來使用。

open系統呼叫的原型:

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

int main()
{
    int open(const *path, int oflags);//1
    int open(const *path, int oflags, mode_t mode);//2

    exit(0);
}

open有兩種呼叫方法:

1.

int open(const *path, int oflags);

將準備開啟的檔案或是裝置的名字作為引數path傳給函式,oflags用來指定檔案訪問模式。open系統呼叫成功返回一個新的檔案描述符,失敗返回-1。
其中,oflags是由必需檔案訪問模式和可選模式一起構成的(通過按位或“|”):
必需部分:
O_RDONLY———-以只讀方式開啟
O_WRONLY———以只寫方式開啟
O_RDWR————以讀寫方式開啟
可選部分:
O_CREAT————按照引數mode給出的訪問模式建立檔案
O_EXCL————–與O_CREAT一起使用,確保創建出檔案,避免兩個程式同時建立同一個檔案,如檔案存在則open呼叫失敗
O_APPEND———-把寫入資料追加在檔案的末尾
O_TRUNC———–把檔案長度設定為0,丟棄原有內容

將一個現有檔案的內容拷貝到新檔案中,新檔案已存在

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    char buff[128] = {0};
    int out = open("file.c",O_RDONLY);//以只讀方式開啟檔案
    int in = open("text.c",O_WRONLY);//以只寫方式開啟另外一個檔案

    int real_num_read = read(out, buff, 128);
    while(real_num_read)//讀到即寫入
    {
        write(in, buff, 128);//寫入的位元組數為實際讀到的個數
    }

    close(out);
    close(in);
    exit(0);
}

2.

int open(const *path, int oflags, mode_t mode);

在第一種呼叫方式上,加上了第三個引數mode,主要是搭配O_CREAT使用,同樣地,這個引數規定了屬主、同組和其他人對檔案的檔案操作許可權。

S_IRUSR———-讀許可權 )
S_IWUSR———寫許可權 ——檔案屬主
S_IXUSR———-執行許可權 )
S_IRGRP———-讀許可權 )
S_IWGRP———寫許可權 ——檔案所屬組
S_IXGRP———-執行許可權 )
S_IROTH———-讀許可權 )
S_IWOTH———寫許可權——其他人
S_IXOTH———-執行許可權 )
另外,也可以用文字設定法:
0——————無許可權
1——————只執行
2——————只寫
4——————只讀

將一個現有檔案的內容拷貝到新檔案中,新檔案需自行建立

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

int main()
{
    int fr = open("./text_open_file.txt", O_RDONLY);
    assert(fr!=-1);
    int real_num;
    char buf[128] = {0};
    real_num = read(fr,buff,127);

    int fw = open("./file.txt",O_WRONLY | O_CREAT, 0600);
    assert(fw!=-1);

    while(real_num)
    {
        write(fw,buff,127);
        real_num = read(fr,buff,127);
    }

    close(fw);
    close(fr);
    exit(0);
}

兩個檔案的內容:

這裡寫圖片描述

這裡寫圖片描述

五、close系統呼叫
終止檔案描述符flides與其對應的檔案間的聯絡,檔案描述符被釋放,可重新使用。

1.close系統呼叫

#include <unistd.h>

int close(int flides);

使用完檔案描述符之後,要記得釋放!

相關推薦

Linux的系統呼叫openwritereadclose,及相關總結

在進行C語言學習的時候我們瞭解到了C語言相關的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相關函式,他們都是由C庫函式提供的一些函式,是將作業系統的系統呼叫加以封裝,雖說Linux是由C語言實現的,但為了使我們更加的瞭解Linux,就需

系統呼叫——openwritereadclose

一、檔案描述符 每一個程序都有一個與之相關的檔案描述符,它們是一些小值整數,我們可以通過這些檔案描述符來訪問開啟的檔案。 一般地,一個程式開始執行時,會自動開啟3個檔案描述符: 0——–標準輸入———-stdin 1——–標準輸出———-stdout

linux系統呼叫openwritecloseread以及stat函式詳解

學習筆記 參考連結1 、參考連結2以及百度百科 在進行C語言學習的時候我們瞭解到了C語言相關的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相關函式,他們都是由C庫函式提供的一些函式,是將作業系

openwriteread函式及應用

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

檔案操作程式設計一(openclosereadwritelseek函式的使用)

一、open()函式用於開啟或建立檔案,在開啟或建立檔案時可以指定檔案的屬性及使用者的許可權等各種引數 所需標頭檔案:#include <sys/types.h> /* 提供型別pid_t 的定義 */ #include <sys/stat.h> #

檔案 I/O操作openlseekreadwriteclose詳解

一,檔案描述符、套接字和管道        對於核心而言,所有開啟的開啟的檔案都通過檔案描述符引用。檔案描述符是一個非負整數。        核心為每個程序維護一個結構體struct task_struct,可稱為程序控制塊(PCB: Process Control Bloc

函式readwritelseek

函式原型:  #include<unistd.h> ssize_t read(int fd, void *buf, size_t count);

封裝readwriteacceptconnect函式,實現超時操作。

學習linux網路程式設計的時候,看視訊學習,封裝了一些可以直接拿來用的函式,方便以後查詢。 /**  * read_timeout - 讀超時檢測函式,不含讀操作  *@fd: 檔案描述符  *@wait_seconds: 等待超時秒數,如果為0表示不檢測超時  * 成功

【Linux】使用readwritelseek函式實現檔案讀寫操作

本文章主要講述Linux環境下檔案的讀寫操作,使用到的函式有open、read、write、lseek。 open:用於開啟或者建立檔案。 read:從檔案中讀指定位元組的資料到記憶體中。 write:講記憶體中資料寫入到檔案中。 lseek:可以改變當前檔案偏移量。 #

關於document的三個方法:openwriteclose

document.open會開啟一個新文件,清除已載入的文件;document.write在HTML載入後呼叫會導致open方法呼叫一次;document.close會關閉開啟的文件。 直接看程式碼和效果圖: <!DOCTYPE html> &l

核心態與使用者態系統呼叫與庫函式檔案IO與標準IO緩衝區等概念介紹

概述 Linux提供了兩套可以用於檔案的IO介面: 檔案IO: open、create、close、lseek、read、write、fcntl、ioctl等 標準IO: FILE、fopen、fwrite、fread、等 為了理解檔案IO和標準I

系統呼叫fork()vfork()與clone()

系統呼叫clone()的主要用途是建立一個執行緒,可以根據引數選擇性複製程序的資源。fork(),全面複製父程序的資源。vfork(),與父程序共享使用者空間,當建立了子程序,子程序先執行,等子程序退出後父程序再執行(與execve()配合使用)。 clone、fork、v

Linux 檔案系統呼叫open七日遊(三)

接著上回,當對“.”和“..”處理完成後就直接返回進入下一個子路徑迴圈了,但如果當前子路徑不是“.”或“..”呢? 【fs/namei.c】 sys_open > do_sys_open > do_filp_open >&

linux 系統呼叫open 七日遊(二)

接著昨日的旅程,我們應該開始處理具體的子路徑了: 【fs/namei.c】 sys_open->do_sys_open->do_filp_open->path_openat->link_path_walk 點選(此處)摺疊或開啟 &n

linux系統呼叫open七日遊(一)

友情提示:您需要一個 kernel 3.15.6,下載地址: https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.15.6.tar.xz     我們將以 Linux 系統呼叫 open 為主線,參

Linux 系統呼叫 open 七日遊(七)

【場景三】open(pathname, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)     在這個場景中我們希望建立一個新檔案(O_CREAT),並賦予該檔案使用者可讀(S_IRUSR)和使用者可寫(S_IW

Linux檔案系統呼叫open 七日遊 (六)

還記得在上一個場景中,build_open_flags裡面有一個對標誌位O_PATH的判斷麼?現在我們就來看看這個標誌位是幹啥的: 【場景二】open(pathname,O_PATH)     這個O_PATH似乎是不常用的,咱們先看看它的使用

linux檔案系統呼叫 open 七日遊(四)

現在,我們的“路徑行走”只剩下最後一個小問題需要處理了——符號連結。 【fs/namei.c】 sys_open > do_sys_open > do_filp_open > path_openat &g

web大前端-JS資料型別轉換常用輸入輸出方法promptwritealertconsole 資料型別判斷typeof運算子

常用的三個客戶端輸出方法 document.write(str) 功能:在網頁的<body>標記,輸出str的內容 document是一個文件物件,代表整個網頁。 write()是document物件的一個輸出方法。 ".":通過小數點來呼叫物件的方法。 str:

系統呼叫與庫函式的區別聯絡(API)

在寫程式的過程中,像MFC,VC++這些程式設計,都會涉及到函式的呼叫,有庫函式也有系統函式,下面看一看它們的區別!! 系統呼叫(system call)和庫函式呼叫(Library function call)的區別? 理解庫函式的區別和系統呼叫,首先是kernel m