Linux系統程式設計學習筆記(1)-檔案的I/O操作
概述
在Linux系統下,通常以一個非負整數來代指一個開啟的檔案,這些檔案可以包括終端,socket,裝置,普通檔案等等。規定的三個標準的檔案描述符為0,1,2下面分別介紹(在互動式shell中,這些檔案描述符通常指向shell執行所在的終端):
檔案描述符0:
用途:標準輸入
POSIX名稱: STDIN_FILENO檔案描述符1:
用途:標準輸出
POSIX名稱STDOUT_FILENO檔案描述符2
用途:標準錯誤
POSIX名稱:STDERR_FILENO
注:推薦使用
常用的標準函式
fd = open(pathname,flags,mode)
fd即為檔案描述符, flags引數指定了檔案的開啟方式,mode指定了建立檔案的訪問許可權,若open函式沒有建立檔案,則此引數可以忽略。
numread = read(fd, buffer,count)
從檔案描述符fd所指代的檔案中讀取count個數據到buffer中,返回值即為讀取到的位元組數。
numwritten = write(fd,buffer,count)
與read函式類似
status = close(fd)
輸入與輸出操作完成之後,呼叫次函式以釋放資源。
一個簡單的I/O操作如下,實現了對檔案內容的複製:
#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#ifndef BUF_SIZE
#define BUF_SIZE 1024
#endif
using namespace std;
int main(int argc, char *argv[])
{
int inputFd, outputFd, openFlags;
mode_t filePerms;
ssize_t numRead;
char buf[BUF_SIZE];
/*確保在終端輸入了正確的檔案路徑*/
if (argc != 3 || strcmp(argv[1], "--help") == 0)
cout <<"param error??"<<endl;
/*開啟輸入檔案*/
inputFd = open(argv[1], O_RDWR);
if (inputFd == -1)
cout<<"open file"<<argv[1]<<"failed!!"<<endl;
openFlags = O_CREAT | O_WRONLY | O_TRUNC;
filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
/*開啟輸出檔案*/
outputFd = open(argv[2], openFlags, filePerms);
if(outputFd == -1)
cout<<"open file"<<argv[2]<<"failed!!"<<endl;
/*複製檔案內容*/
while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
if (write(outputFd, buf, numRead) != numRead)
cout<<"couldnot wrire whole buffer"<<endl;
if (numRead == -1)
cout<<"read wrong!!"<<endl;
/*關閉兩個檔案*/
if (close(inputFd) == -1)
cout<<"can not close input file!!"<<endl;
if (close(outputFd) == -1)
cout<<"can not close output file!!"<<endl;
return 0;
}
g++ main.cpp -o io_test
好玩的是,例如下面的命令:
./io_test /dev/tty a.txt
會接受開啟程式之後使用者在終端的輸入,知道使用Ctrl+c結束程式之前,使用者的輸入會一直記錄到a.txt當中。反之亦然。
open函式
fd = open(pathname,flags,mode)
mode引數只在建立新檔案時有用,主要有以下幾個引數可供選擇:
- O_RDONLY:只讀方式開啟檔案
- O_WRONLY:只寫方式開啟檔案
- O_RDWR: 讀寫方式開啟檔案
flags引數較多且經常使用,下面介紹各種引數的用途:
- O_RDONLY:只讀方式開啟
- O_WRONLY:只寫方式開啟
- O_RDWR:讀寫方式開啟
- O_CREAT:若檔案不存在則建立,注意要加入mode引數
- O_DIRECT:無緩衝的輸入輸出
- O_DIRECTORY:若pathname不是檔案目錄則失敗
- O_EXCL:結合O_CREAT引數使用,用於建立檔案,若檔案已經存在,則不會開啟檔案且報錯
- O_NOATIME:讀取檔案時,不修改最近訪問時間
- O_NOCTTY:不讓pathname所指向的檔案成為控制終端
- O_NOFOLLOW:對符號連結不予解引用
- O_TRUNC:截斷已有檔案,使其長度為0
- O_APPEND:總在檔案末尾追加資料
- O_NONBLOCK:以非阻塞方式開啟
- O_SYNC:以同步方式開啟檔案
read()函式
read函式從檔案描述符代指的檔案中讀取資料。buffer引數通過用來存放輸入資料的記憶體緩衝區地址。read成功將返回讀取的位元組數。當然也可以使用上述提到的標準檔案描述符,直接從終端讀取資料
numread = read(STDIN_FILENO, buffer, MAX_READ)
注意,由於直接從終端讀取,讀取的資料型別不確定,read函式無法在讀取的資料末尾加上結尾字元’\0’,因此需要人為新增
buffer[numread] = '\0'
才能正確顯示輸入的資料。
改變檔案偏移量
off_t lseek(int fd, offt_t offset, int whence)
off_t資料型別為有符號整數型,whence引數表明依照哪個基點來結束offset引數
- SEET_SET:檔案頭部
- SEET_CUR:當前檔案偏移量
- SEET_END:檔案尾部,offset引數從檔案最後一個位元組的下一個位元組開始
列印錯誤資訊
採用linux系統讀寫函式時,經常出現檔案不存在或者訪問許可權的問題,要知道出現的是什麼錯誤,可以使用perror函式
perror(string)
這個函式可以列印上一次函式的錯誤資訊,string主要為了顯示錯誤的同時顯示一些描述性的資訊
相關推薦
Linux系統程式設計學習筆記(1)-檔案的I/O操作
概述 在Linux系統下,通常以一個非負整數來代指一個開啟的檔案,這些檔案可以包括終端,socket,裝置,普通檔案等等。規定的三個標準的檔案描述符為0,1,2下面分別介紹(在互動式shell中,這些檔案描述符通常指向shell執行所在的終端): 檔案描述
linux 監控效能學習筆記(1)
top命令中的 load average後面的三個數字分別表示距離現在一分鐘,五分鐘,十五分鐘的負載情況。 在單核系統中100%利用負載標識為1.00,雙核系統標識2.00 四核系統標識為4.00 因此,有一個 14 load average值和 24個 核心的負載
linux網路程式設計學習筆記(一)
目錄 1. 獲取系統呼叫錯誤資訊:errno strerror() perror(); 他跟c語言中的fopen()有什麼區別呢? 他也呼叫的是這個open(); 2.常規檔案操作之建立、讀、寫
Linux網路程式設計學習筆記(7)---5種I/O模型及select輪詢
本文主要介紹5種I/O模型,select函式以及利用select實現C/S模型。 1、5種I/O模型 (1)阻塞I/O: 一直等到資料到來,才會將資料從核心中拷貝到使用者空間中。 (2)非阻塞I/O: 每過一段時
shell程式設計學習筆記(1)
接觸到linux已經有2-3年了,一些基本的命令用的還算很熟,但一直沒有系統的對linux進行學習,可以說學的的很零散,遇到問題一般通過網路也能找到答案。 最近突然不忙了,想系統的學習一下shell程式設計。可以說對linux的熟悉離不開對shell的學習,而作為一個好的系
R語言學習筆記,(1)基礎及向量操作
一、基礎部分(持續更新) 1、大小寫明感 2、source(“d:/test.R”):可以執行對應目錄下得test.R指令碼。R中\符號為轉義字元,所有目錄中需使用/或者\\.。 3、sink(“d:/out.txt”):將後續的輸出由終端轉向一個外部檔案,本例中為d;/o
java學習筆記(9)-Java I/O系統
第九章 Java I/O系統 1、題目 1.1、 何為流?根據流的方向,流可分為哪兩種? 流表示檔案傳播的方向和傳播的檔案資訊的集合。根據流的方向,流可分為輸入與輸出流。 PPT:流是在計算機的輸入、輸出操作中流動的資料序列。 1.2、 I
【鳥叔的Linux私房菜】學習筆記(1)——Linux系統入門
雖然現在工作一直在用Xshell 一些 基本的命令、常用的還可以, 但總感覺對Linux瞭解的知之甚少,偶爾改個檔案還需要請教同事,真是慚愧。 所以決定從今天開始重新學習下Linux,查漏補缺,並將學習的結果作為筆記和大家一塊交流和進步,就開始我們今天的學習吧。 一
bootstrap 學習筆記(1)---介紹bootstrap和柵格系統
優先 cal 圖片 應用 尺寸 文件中 lin png ice 學習前端許久,對於布置框架和響應瀏覽器用html 和javascript 寫的有點繁瑣,無意間看到這個框架,覺得挺好用的就開始學習了,但是這個框架上面有很多知識,不是所有的都要學的,故將學習筆記和覺得重點的
linux學習筆記(1)
1 linux之父是linus Torvalds(李納斯 托沃滋),1991年他在赫爾辛基大學讀書時自己手動寫了一個電腦操作系統,取名linux,並且公布了源代碼。 C語言之父是Dennis M Ritchie(丹尼斯 裏奇)。 JAVA之父是詹姆斯高斯林,出生在加拿大,他編寫了多處理器版本的unix操
Linux第三周學習筆記(1)
命令 hiho 並且 ron 增加 如果 mkdir strong lin Linux第三周學習筆記(1)2.20 特殊權限stick_bit特殊權限stick_bit:意為防刪除位。文件是否可以被某一個用戶刪除,主要取決於該文件所在目錄是否對該用戶具有寫的權限。如果沒有寫
linux高性能編程學習筆記(1)
linuxTCP/TP協議族:分層、多協議的通信體系,四層協議系統,自底向上:數據鏈路層、網絡層、傳輸層、應用層數據鏈路層:實現網卡接口的網絡驅動程序,以處理數據在物理媒介上得到傳輸數據鏈路層兩個常用的協議:ARP協議(地址解析協議)、RARP協議(逆地址解析協議)網絡層:實現數據包的選路和轉發網絡層最核心的
Linux學習筆記(1)linux的開關機及重啟
baidu 方式 圖形界面 class bsp har boot init5 ida linux的啟動流程 一、啟動 (1)電源 開關 (2)選擇啟動方式:FLOPPY/BIOS/CDROM(軟盤/bios啟動/光盤) 基於MBR引導方式 【1】MBR:最多只能劃分4
程式設計藝術學習筆記(1)
序言習題 (1).通過一系列的替代,將四個變數的值(a,b,c,d)變為(b,c,d,a),用最少的步驟 開門菜,然而還是有很多值得思考的地方。能幫助人理解計算機對於賦值的操作。通過觀察,可以認為這是一個a[i]賦值給a[i-1]的操作。最少的步驟,只需要五步即可。需要一個t來作輔助
Vue學習筆記(1)——在頁面右上角實現可懸浮/隱藏的系統選單
轉自榕樹島 本文不能算一個教程,而是記錄一隻Vue菜鳥踩坑心路歷程的筆記,對於正在踩坑的新手或許會有一點小幫助。作為第一篇正經八百的技術部落格,歡迎大家發表看法,關愛菜鳥,請輕拍 很久以後回來更一下,這個功能可以用Vuex輕鬆搞定,此文就當練習父子元件通訊了吧,emmm…… 原文: 這是個
Kafka學習筆記(1)----Kafka的簡介和Linux下單機安裝
1. Kafka簡介 Kafka is a distributed,partitioned,replicated commit logservice。它提供了類似於JMS的特性,但是在設計實現上完全不同,此外它並不是JMS規範的實現。kafka對訊息儲存時根據Topic進行歸類,傳送訊息者成為Produ
Javascript高階程式設計學習筆記(三)—— JS中的資料型別(1)
前一段時間由於事情比較多,所以筆記耽擱了一段時間,從這一篇開始我會盡快寫完這個系列。 文章中有什麼不足之處,還望各位大佬指出。 JS中的資料型別 上一篇中我寫了有關JS引入的Script標籤相關的東西。 那麼這一篇,我們可以正式進入JS的世界了,emmm 前面的東西應該比較基礎,大佬們不
linux學習筆記(1):linux基礎知識
1.linux是什麼? Linux這個詞本身只表示Linux核心,但實際上人們已經習慣了用Linux來形容整個基於Linux核心,並且使用GNU 工程各種工具和資料庫的作業系統。 2. 什麼是shell 保護系統核心並對外提供操作介面的軟體 在linux中預設的
Javascript高階程式設計學習筆記(12)—— 引用型別(1)Object型別
前面的文章中我們知道JS中的值分為兩種型別 基礎型別的值和引用型別的值 基礎型別的值我已經大概介紹了一下,今天開始後面幾天我會為大家介紹一下引用型別的值 Object型別 物件是引用型別的值的例項,在ECMA中引用型別是一種資料結構 用於將資料和功能組織到一起,在其它程式語言中通常也
資料庫課設(圖書管理系統)學習筆記(1)
圖書館課課設圖片插入,讀出 BufferedImage: 所述BufferedImage亞類描述了一種Image與影象資料的訪問的緩衝器。 A BufferedImage由影象資料的ColorModel和Raster組成。 SampleModel中SampleModel中的Raster的