open函數和close函數的使用

學習幾個常用的Linux系統I/O函數:open、close、write、read和lseek。注意,系統調用函數必須都考慮返回值。

(1open函數的使用

首先,需要包含三個頭文件:<sys/types.h>?? <sys/stat.h>?? <fcntl.h>

以如下代碼為例:

[root@localhost src]# ls

add.c? div.c? hello? main.c? mul.c? sub.c? zsx? zsx.c

[root@localhost src]# vim zsx.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>  //前三個頭文件對應庫函數open
#include <stdlib.h>  //對應庫函數exit
#include <stdio.h>   //對應庫函數 perror和printf
#include <unistd.h>  //對應庫函數closeint main( )
{int fd;  //記錄open函數返回值fd = open("zsxhello",O_RDWR);  //以讀寫方式打開一個不存在的文件,當前目錄printf("fd=%d\n",fd);if( fd == -1 )  //如果打開失敗{perror("open zsxhello");  //則輸出打開失敗的原因(詳細錯誤信息)exit(1);  //并結束當前進程,則后面程序不再執行}//如果打開成功,繼續向后執行  注意exit函數結束當前進程,在頭文件stdlib.h中聲明int ret = close( fd );    //打開后關閉該文件printf("ret=%d\n",ret);if( ret == -1 )     //如果關閉文件失敗{perror("close zsxhello");   //輸出出錯的詳細信息exit(1);}return 0;
}

[root@localhost src]# gcc -pipe -pedantic -Wall -ggdb3 zsx.c -o zsx

[root@localhost src]# ldd zsx

?????? linux-vdso.so.1 =>? (0x00007fff21f18000)

?????? libc.so.6 => /lib64/libc.so.6 (0x00007eff28730000)

?????? /lib64/ld-linux-x86-64.so.2 (0x00007eff28b10000)

[root@localhost src]# ./zsx

fd=-1? //文件打開失敗

open zsxhello: No such file or directory?? //錯誤詳細信息

?

//下面說明如何利用open函數創建一個文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>int main( )
{int fd;fd = open("hello",O_RDWR);  //打開一個已有的文件printf("fd=%d\n",fd);if( fd == -1 ){perror("open hello");}int fd1 = open("zsxhello",O_RDWR | O_CREAT,0777);  //創建一個zsxhello文件printf("fd1=%d\n",fd1);if( fd1 == -1 ){perror("open zsxhello");}int ret = close( fd ); //關閉hello文件printf("ret=%d\n",ret);if( ret == -1 ){perror("close hello");}int ret1 = close( fd1 );  //關閉zsxhello文件printf("ret1=%d\n",ret1);if( ret1 == -1 ){perror("close zsxhello");}return 0;
}

[root@localhost src]# ./zsx

fd=3??

fd1=4?? //可以看到新打開的兩個文件描述符為3、4

ret=0?

ret1=0?? //成功關閉文件

?

int fd1 = open("zsxhello",O_RDWR | O_CREAT,0777);? //創建一個zsxhello文件

O_RDWR | O_CREAT? 參數表示創建該文件,且以讀寫的方式打開?? 0777定義創建文件的權限,文件的權限都是8進制數(以0開頭的數),0777等價于777。

[root@localhost src]# ls

add.c? div.c? hello? main.c? mul.c? sub.c? zsx? zsx.c? zsxhello

[root@localhost src]# ll zsxhello

-r-xr-xr-x. 1 root root 0 Mar 18 18:09 zsxhello

[root@localhost src]# umask ?//掩碼,操作系統對文件的一種保護機制

0777

注意:可看到文件zsxhello的權限并不是0777,而是0555這是因為文件的實際權限與掩碼umask有關。因此,可以根據掩碼值,來計算出相應的給定值,從而達到自己想要的最終實際值,也可以修改掩碼: umask 0000? 將掩碼值修改為 0000

文件權限由open的mode參數和當前進程的umask掩碼共同決定:

//利用open函數對文件進行截斷? O_TRUNC參數

將文件截斷就是將文件內容刪除一部分,留一部分。將文件截斷為0就是刪除文件全部內容(清空)。代碼如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>int main( )
{int fd;fd = open("hello",O_RDWR | O_TRUNC); //以讀寫方式打開hello文件,并將其截斷為0printf("fd=%d\n",fd);if( fd == -1 ){perror("open hello");exit(1);     //若打開失敗,退出當前進程,此時main函數返回值不再為0}int ret;ret = close( fd );printf("ret=%d\n",ret);if( ret == -1 ){perror("close hello");exit(1);  //若關閉失敗,退出當前進程,此時main函數返回值不再為0}return 0;
}

[root@localhost src]# ll hello

-rwxrwxrwx. 1 root root 14 Mar 18 16:58 hello

[root@localhost src]# ./zsx

fd=3

ret=0

[root@localhost src]# ll hello

-rwxrwxrwx. 1 root root 0 Mar 18 18:38 hello

注意上面代碼:對于Linux系統I/O函數,都有返回值,且需要對返回值進行判斷,并作出相應處理,如退出當前進程。

//利用open函數判斷文件是否存在? O_CREATO_EXCL參數必須同時使用,即通過創建文件的方式來判斷其是否存在,如果存在,出錯,并給出提示。代碼如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>int main( )
{int fd;fd = open("hello",O_RDWR | O_CREAT | O_EXCL,0777);  判斷hello文件是否存在 printf("fd=%d\n",fd);if( fd == -1 ){perror("open hello");exit(1);}int ret;ret = close( fd );printf("ret=%d\n",ret);if( ret == -1 ){perror("close hello");exit(1);}return 0;
}

[root@localhost src]# ./zsx

fd=-1

open hello: File exists

如果將fd = open("hello",O_RDWR | O_CREAT | O_EXCL,0777);??? 改為:? fd = open("hello",O_RDWR | O_CREAT,0777);? 仍然能正常打開已經存在的文件,對于不存在的文件則創建,執行結果:

[root@localhost src]# ./zsx

fd=3

ret=0

(2close函數的使用

#include <unistd.h>? //包含頭文件

int close(int fd);??? //返回值為0或-1,0代表關閉文件成功,-1代表關閉文件失敗。 參數為所要關閉文件的文件描述符。 關閉文件出錯,則會賦值給errno一個對應的代碼值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385408.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Leetcode | 9】217. 存在重復元素

解題代碼&#xff1a; bool containsDuplicate(vector<int>& nums) {return nums.size() > set<int>(nums.begin(), nums.end()).size(); }

全緩沖、行緩沖和無緩沖

這里的緩沖是指的是用戶空間的I/O緩沖區&#xff0c;不是內核緩沖。 無緩沖&#xff1a;用戶層不提供緩沖&#xff0c;數據流直接到內核緩沖&#xff0c;再到磁盤等外設上。標準錯誤輸出&#xff08;2&#xff09;通常是無緩存的&#xff0c;因為它必須盡快輸出&#xff0c;且…

【Leetcode】1. 兩數之和

給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那 兩個 整數&#xff0c;并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;你不能重復利用這個數組中同樣的元素。 示例: 給定 nums [2, 7, 11, 15], targ…

read和write函數的使用

都需要包含頭文件&#xff1a; <unistd.h> read系統函數從打開的設備或文件中讀取數據&#xff0c;即將數據從外設上經過內核讀到用戶空間&#xff1b;write系統函數相反&#xff0c;向打開的設備或文件中寫入數據&#xff0c;即將數據從用戶空間&#xff08;I/O緩沖&am…

1091. Acute Stroke (30)

One important factor to identify acute stroke (急性腦卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions are identified in each MRI slice, your job is to calculate the volume of the stroke core. Input Speci…

lseek函數的使用

需要包含頭文件&#xff1a;<sys/types.h> <unistd.h> off_t lseek(int fd, off_t offset, int whence)&#xff1b; 函數原型 函數功能&#xff1a;移動文件讀寫指針&#xff1b;獲取文件長度&#xff1b;拓展文件空間。 在使用該函數之前需要將文件打開&…

19. 刪除鏈表的倒數第N個節點

給定一個鏈表&#xff0c;刪除鏈表的倒數第 n 個節點&#xff0c;并且返回鏈表的頭結點。 示例&#xff1a; 給定一個鏈表: 1->2->3->4->5, 和 n 2. 當刪除了倒數第二個節點后&#xff0c;鏈表變為 1->2->3->5. 說明&#xff1a; 給定的 n 保證是有效的。…

文件操作相關的系統函數

重點學習&#xff1a;stat&#xff08;fstat、lstat 獲取文件屬性&#xff09;、access&#xff08;測試指定文件是否擁有某種權限&#xff09;、chmod&#xff08;改變文件的權限&#xff09;、chown&#xff08;改變文件的所屬主和所屬組&#xff09;、truncate&#xff08;截…

stat函數(stat、fstat、lstat)

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> //需包含頭文件 有如下三個函數的函數原型&#xff1a; int stat(const char *path, struct stat *buf); 第一個形參&#xff1a;指出文件&#xff08;文件路徑&#xff09;&…

1062. Talent and Virtue (25)

About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about peoples talent and virtue. According to his theory, a man being outstanding in both talent and virtue must be a "sage&#xff08;圣人&#xff09;"…

access、strtol函數的使用(后者為C庫函數)

#include <unistd.h> int access(const char *pathname, int mode); 作用&#xff1a;檢查調用該函數的進程是否可以對指定的文件執行某種操作。 第一個形參&#xff1a;文件名&#xff1b;第二個形參&#xff1a;R_OK&#xff08;是否可讀&#xff09;、W_OK&#xf…

chmod、chown函數的使用

#include <sys/stat.h> int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); 作用&#xff1a;改變指定文件的權限。第二個參數&#xff1a;mode必須為一個8進制數&#xff1b;返回值為0表示成功&#xff0c;-1表示失敗。 //代碼 #include…

606. 根據二叉樹創建字符串

你需要采用前序遍歷的方式&#xff0c;將一個二叉樹轉換成一個由括號和整數組成的字符串。 空節點則用一對空括號 "()" 表示。而且你需要省略所有不影響字符串與原始二叉樹之間的一對一映射關系的空括號對。 示例 1: 輸入: 二叉樹: [1,2,3,4] 1 / \ …

truncate、rename函數的使用

#include <unistd.h> #include <sys/types.h> int truncate(const char *path, off_t length); int ftruncate(int fd, off_t length); 作用&#xff1a;用于拓展或截斷文件。將參數path 指定的文件大小改為參數length 指定的大小。如果原來的文件大小比參數le…

【Leetcode】112. 路徑總和

給定一個二叉樹和一個目標和&#xff0c;判斷該樹中是否存在根節點到葉子節點的路徑&#xff0c;這條路徑上所有節點值相加等于目標和。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定如下二叉樹&#xff0c;以及目標和 sum 22&#xff0c; 5 / \ …

link、symlink、readlink、unlink函數的使用

#include <unistd.h> int link(const char *oldpath, const char *newpath); 作用&#xff1a;創建一個硬鏈接 0成功 -1 失敗 //代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(int argc, char* argv[]) {if(ar…

【Leetcode】113. 路徑總和 II

給定一個二叉樹和一個目標和&#xff0c;找到所有從根節點到葉子節點路徑總和等于給定目標和的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定如下二叉樹&#xff0c;以及目標和 sum 22&#xff0c; 5 / \ 4 8 / / \ …

目錄操作相關的系統函數

主要介紹幾個常用函數的使用方法&#xff1a;chdir&#xff08;改變進程的當前工作目錄&#xff09;、getcwd&#xff08;獲取當前進程的工作目錄&#xff09;、mkdir&#xff08;創建目錄&#xff09;、rmdir&#xff08;刪除空目錄&#xff09;、opendir&#xff08;打開一個…

1079. Total Sales of Supply Chain (25)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;經銷商&#xff09;, and suppliers&#xff08;供應商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

chdir、getcwd、mkdir、rmdir函數

#include <unistd.h> int chdir(const char *path); int fchdir(int fd); 作用&#xff1a;改變調用這一函數的進程&#xff08;即程序執行&#xff09;的當前工作目錄&#xff0c;注意不是shell的當前工作目錄。 返回值&#xff1a;0成功 -1失敗 #include <unis…