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.mzph.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…