乔部落格

世界上有10种人:认识二进制的和不认识二进制的

Linux系统调用之open(), close()

joe posted @ 2010年4月24日 17:17 in Unix/Linux with tags 系统调用 , 72101 阅读

open函数可以打开或创建一个文件。

 

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

返回值:成功返回新分配的文件描述符,出错返回-1并设置errno

pathname参数是要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也可以是绝对路径。

flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or。

必选项:以下三个常数中必须指定一个,且仅允许指定一个。

  • O_RDONLY 只读打开
  • O_WRONLY 只写打开
  • O_RDWR 可读可写打开

以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags参数。

  • O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。
  • O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该文件的访问权限。
  • O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。
  • O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Truncate)为0字节。
  • O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/O)。
第三个参数mode指定文件权限,可以用八进制数表示,比如0644表示-rw-r--r--,也可以用S_IRUSRS_IWUSR等宏定义按位或起来表示,详见open(2)的Man Page。要注意的是,文件权限由openmode参数和当前进程的umask掩码共同决定。
close函数关闭一个已打开的文件:
#include <unistd.h>
int close(int fd);

返回值:成功返回0,出错返回-1并设置errno

参数fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符
调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一
个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越
多,会占用大量文件描述符和系统资源。
给个例子:

//filename:test.c
//
#include <error.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
	int fd = open("mytest", O_RDWR | O_CREAT, 0666);
	if (fd == -1)
		perror("open file mytest");
	close(fd);
	return 0;
}
编译:$cc test.c

执行:$./a.out

查看结果:$umask

0002

$ll

总计 12

-rwxrwxr-x 1 joseph joseph 5085 12-17 10:35 a.out

-rw-rw-r– 1 joseph joseph    0 12-17 10:33 mytest

-rw-rw-r– 1 joseph joseph  263 12-17 10:35 test.c

以上例子以mode 0666创建一个文件mytest,而umask是0002,

所以创建的文件权限是0666-0002=0664(-rw-rw-r–)。

 

 

Tom 说:
2018年3月08日 17:23

有一个问题就是我们见到的方法和博客中描述的方法不太相同这件事怎么解释呢?

/usr/include/x86_64-linux-gnu/bits/fcntl2.h
__fortify_function int open (const char *__path, int __oflag, ...)

小宗 说:
2019年9月19日 18:43

您好!我是學徒目前也是看LINUX C語言書本
有一行O_CREAT, 0666(-rw-rw-r–)這個是檔案目錄不存在建立之後面多了0666....

看您程式碼後我學會一部分了!!實在感謝

f88tw 说:
2019年11月03日 09:48

敬启者:个人小网站希望大家多多支持 感谢您对我们热心的支持 f88tw┃华歌尔┃I appreciate your kind assistance. <a data-cke-saved-href="http://mypaper.pchome.com.tw/f88tw" href="http://mypaper.pchome.com.tw/f88tw" "="">http://mypaper.pchome.com.tw/f88tw http://mypaper.pchome.com.tw/f88tw/P1 http://mypaper.pchome.com.tw/f88tw/post/1379131888 http://mypaper.pchome.com.tw/f88tw/post/1370781143 f88tw捡骨师佛经哥|墓园|禁忌|新竹|台北|桃园|苗栗|头份

f88tw┃华歌尔 说:
2019年12月28日 08:27

敬启者:个人小网站希望大家多多支持 感谢您对我们热心的支持 f88tw┃华歌尔┃I appreciate your kind assistance. f88tw|墓园|捡骨流程|捡骨费用|捡骨时间|禁忌|捡骨颜色|捡骨师|新竹|时间|台北|桃园|苗栗|头份|火化|晋塔|安葬|法事|捡骨|看日子|墓穴|墓园|坟墓

f88tw 说:
2021年3月27日 11:54

敬启者:个人小网站希望大家多多支持 感谢您对我们热心的支持 f88tw┃华歌尔┃I appreciate your kind assistance. f88tw|墓园|捡骨流程|捡骨费用|捡骨时间|禁忌|捡骨颜色|捡骨师|新竹|时间|台北|桃园|苗栗|头份|火化|墓穴|墓园|坟墓 |http://mypaper.m.pchome.com.tw/f88tw

f88tw 说:
2021年4月07日 20:55

敬启者:个人小网站希望大家多多支持 感谢您对我们热心的支持 f88tw┃华歌尔┃I appreciate your kind assistance. f88tw粗工粗工内容 粗工粗工内容 |墓园|捡骨流程|捡骨费用|捡骨时间|禁忌|捡骨颜色|捡骨师|新竹|时间|台北|桃园|苗栗|头份|https://mypaper.m.pchome.com.tw/f88tw

CBSE Class 3 Sanskri 说:
2022年9月17日 20:15

For all chapters of the course, get the CBSE Board Class 3 Sanskrit Sample Paper 2023 Pdf. Every year, the board's subject-matter experts establish and revise the course syllabus for all sessions of Terms 1 and 2. CBSE Class 3 Sanskrit Question Paper Download the practise question bank from Set wide to practise at home if you have selected Sanskrit as your second or third language. For the most crucial questions for each chapter of the course, get in touch with your class teacher at the university.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter