日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

open函数和close函数的使用

發布時間:2023/11/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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一個對應的代碼值。

總結

以上是生活随笔為你收集整理的open函数和close函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。