open函数和close函数的使用
學習幾個常用的Linux系統I/O函數:open、close、write、read和lseek。注意,系統調用函數必須都考慮返回值。
(1)open函數的使用
首先,需要包含三個頭文件:<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_CREAT與O_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
(2)close函數的使用
#include <unistd.h>? //包含頭文件
int close(int fd);??? //返回值為0或-1,0代表關閉文件成功,-1代表關閉文件失敗。 參數為所要關閉文件的文件描述符。 關閉文件出錯,則會賦值給errno一個對應的代碼值。
總結
以上是生活随笔為你收集整理的open函数和close函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最近剧荒,有什么好看的电视机剧?
- 下一篇: 全缓冲、行缓冲和无缓冲