当前位置:   article > 正文

open函数和close函数的使用_c使用open打开的文件关闭失败

c使用open打开的文件关闭失败

学习几个常用的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

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h> //前三个头文件对应库函数open
  4. #include <stdlib.h> //对应库函数exit
  5. #include <stdio.h> //对应库函数 perror和printf
  6. #include <unistd.h> //对应库函数close
  7. int main( )
  8. {
  9. int fd; //记录open函数返回值
  10. fd = open("zsxhello",O_RDWR); //以读写方式打开一个不存在的文件,当前目录
  11. printf("fd=%d\n",fd);
  12. if( fd == -1 ) //如果打开失败
  13. {
  14. perror("open zsxhello"); //则输出打开失败的原因(详细错误信息)
  15. exit(1); //并结束当前进程,则后面程序不再执行
  16. }
  17. //如果打开成功,继续向后执行 注意exit函数结束当前进程,在头文件stdlib.h中声明
  18. int ret = close( fd ); //打开后关闭该文件
  19. printf("ret=%d\n",ret);
  20. if( ret == -1 ) //如果关闭文件失败
  21. {
  22. perror("close zsxhello"); //输出出错的详细信息
  23. exit(1);
  24. }
  25. return 0;
  26. }

[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函数创建一个文件

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. int main( )
  7. {
  8. int fd;
  9. fd = open("hello",O_RDWR); //打开一个已有的文件
  10. printf("fd=%d\n",fd);
  11. if( fd == -1 )
  12. {
  13. perror("open hello");
  14. }
  15. int fd1 = open("zsxhello",O_RDWR | O_CREAT,0777); //创建一个zsxhello文件
  16. printf("fd1=%d\n",fd1);
  17. if( fd1 == -1 )
  18. {
  19. perror("open zsxhello");
  20. }
  21. int ret = close( fd ); //关闭hello文件
  22. printf("ret=%d\n",ret);
  23. if( ret == -1 )
  24. {
  25. perror("close hello");
  26. }
  27. int ret1 = close( fd1 ); //关闭zsxhello文件
  28. printf("ret1=%d\n",ret1);
  29. if( ret1 == -1 )
  30. {
  31. perror("close zsxhello");
  32. }
  33. return 0;
  34. }

[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就是删除文件全部内容(清空)。代码如下:

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. int main( )
  8. {
  9. int fd;
  10. fd = open("hello",O_RDWR | O_TRUNC); //以读写方式打开hello文件,并将其截断为0
  11. printf("fd=%d\n",fd);
  12. if( fd == -1 )
  13. {
  14. perror("open hello");
  15. exit(1); //若打开失败,退出当前进程,此时main函数返回值不再为0
  16. }
  17. int ret;
  18. ret = close( fd );
  19. printf("ret=%d\n",ret);
  20. if( ret == -1 )
  21. {
  22. perror("close hello");
  23. exit(1); //若关闭失败,退出当前进程,此时main函数返回值不再为0
  24. }
  25. return 0;
  26. }

[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参数必须同时使用,即通过创建文件的方式来判断其是否存在,如果存在,出错,并给出提示。代码如下:

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. int main( )
  8. {
  9. int fd;
  10. fd = open("hello",O_RDWR | O_CREAT | O_EXCL,0777); 判断hello文件是否存在
  11. printf("fd=%d\n",fd);
  12. if( fd == -1 )
  13. {
  14. perror("open hello");
  15. exit(1);
  16. }
  17. int ret;
  18. ret = close( fd );
  19. printf("ret=%d\n",ret);
  20. if( ret == -1 )
  21. {
  22. perror("close hello");
  23. exit(1);
  24. }
  25. return 0;
  26. }

[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一个对应的代码值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/256414
推荐阅读
相关标签
  

闽ICP备14008679号