linux系统编程之文件与I/O(一):文件的打开关闭
2016-10-22 23:00
483 查看
一、文件描述符
对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体)。
一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。
fileno:将文件指针转换为文件描述符
fdopen:将文件描述符转换为文件指针
二、什么是I/O
输入/输出是主存和外部设备之间拷贝数据的过程
设备->内存 (输入操作)
内存->设备 (输出操作)
高级I/O
ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O
低级I/O
通常也称为不带缓冲的I/O
三、文件的打开关闭
open系统调用1:
函数原型
int open(const char *path, int flags);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
返回值:
打开成功,返回文件描述符;打开失败,返回-1
open系统调用2:
函数原型
int open(const char *path, int flags,mode_t mode);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode: 用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限
返回值:
打开成功,返回文件描述符;打开失败,返回-1
打开文件的方式:
O_RDONLY 打开一个供读取的文件
O_WRONLY 打开一个供写入的文件
O_RDWR 打开一个可供读写的文件
O_APPEND 写入的所有数据将被追加到文件的末尾
O_CREAT 打开文件,如果文件不存在则建立文件
O_EXCL 如果已经置O_CREAT且文件存在,则强制open() 失败
O_TRUNC 在open() 时,将文件的内容清空
O_CLOEXEC 在进行exec进程替换时关闭打开的文件描述符。
Specifying this flag permits a program to avoid additional fcntl(2) F_SETFD operations to set the FD_CLOEXEC flag.
O_NONBLOCK 非阻塞模式
访问权限:
S_IRUSR 文件所有者的读权限位
S_IWUSR 文件所有者的写权限位
S_IXUSR 文件所有者的执行权限位
S_IRWXU S_IRUSR | S_IWUSR | S_IXUSR
S_IRGRP 文件用户组的读权限位
S_IWGRP 文件用户组的写权限位
S_IXGRP 文件用户组的执行权限位
S_IRWXG S_IRGRP | S_IWGRP | S_IXGRP
S_IROTH 文件其他用户的读权限位
S_IWOTH 文件其他用户的写权限位
S_IXOTH 文件其他用户的执行权限位
S_IRWXO S_IROTH | S_IWOTH | S_IXOTH
为了重新利用文件描述符,用close()系统调用释放打开的文件描述符
函数原型:int close(int fd);
函数参数:
fd :要关闭的文件的文件描述符
返回值:
如果出现错误,返回-1;调用成功返回0
示例程序如下:
输出为:
fileno(stdin) = 0
open success.
需要说明的是,在linux系统编程中使用的一些系统调用函数一般如果失败返回-1且会置全局变量errno为特定的错误码,可以使用perror打印,或者通过strerror(errno)打印错误提示。
参考:《APUE》
转载自http://blog.csdn.net/jnu_simba/article/details/8917854
对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体)。
一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。
fileno:将文件指针转换为文件描述符
fdopen:将文件描述符转换为文件指针
二、什么是I/O
输入/输出是主存和外部设备之间拷贝数据的过程
设备->内存 (输入操作)
内存->设备 (输出操作)
高级I/O
ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O
低级I/O
通常也称为不带缓冲的I/O
三、文件的打开关闭
open系统调用1:
函数原型
int open(const char *path, int flags);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
返回值:
打开成功,返回文件描述符;打开失败,返回-1
open系统调用2:
函数原型
int open(const char *path, int flags,mode_t mode);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode: 用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限
返回值:
打开成功,返回文件描述符;打开失败,返回-1
打开文件的方式:
O_RDONLY 打开一个供读取的文件
O_WRONLY 打开一个供写入的文件
O_RDWR 打开一个可供读写的文件
O_APPEND 写入的所有数据将被追加到文件的末尾
O_CREAT 打开文件,如果文件不存在则建立文件
O_EXCL 如果已经置O_CREAT且文件存在,则强制open() 失败
O_TRUNC 在open() 时,将文件的内容清空
O_CLOEXEC 在进行exec进程替换时关闭打开的文件描述符。
Specifying this flag permits a program to avoid additional fcntl(2) F_SETFD operations to set the FD_CLOEXEC flag.
O_NONBLOCK 非阻塞模式
访问权限:
S_IRUSR 文件所有者的读权限位
S_IWUSR 文件所有者的写权限位
S_IXUSR 文件所有者的执行权限位
S_IRWXU S_IRUSR | S_IWUSR | S_IXUSR
S_IRGRP 文件用户组的读权限位
S_IWGRP 文件用户组的写权限位
S_IXGRP 文件用户组的执行权限位
S_IRWXG S_IRGRP | S_IWGRP | S_IXGRP
S_IROTH 文件其他用户的读权限位
S_IWOTH 文件其他用户的写权限位
S_IXOTH 文件其他用户的执行权限位
S_IRWXO S_IROTH | S_IWOTH | S_IXOTH
为了重新利用文件描述符,用close()系统调用释放打开的文件描述符
函数原型:int close(int fd);
函数参数:
fd :要关闭的文件的文件描述符
返回值:
如果出现错误,返回-1;调用成功返回0
示例程序如下:
/************************************************************************* > File Name: file_oper.c > Author: Simba > Mail: dameng34@163.com > Created Time: Sat 23 Feb 2013 02:34:02 PM CST ************************************************************************/ #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> // #define ERR_EXIT(m) (perror(m), exit(EXIT_FAILURE)) #define ERR_EXIT(m) \ do { \ perror(m); \ exit(EXIT_FAILURE); \ } while(0) /* fileno:将文件指针转换为文件描述符 * fdopen:将文件描述符转换为文件指针 */ int main(void) { printf("fileno(stdin) = %d\n", fileno(stdin)); int fd; /* fd = open("test.txt", O_RDONLY); if (fd == -1) { // perror("open error"); fprintf(stderr, "open error with errno=%d:%s\n", errno, strerror(errno)); exit(EXIT_FAILURE); } */ /* if (fd == -1) ERR_EXIT("open error"); printf("open success.\n"); */ umask(0); //不继承shell的umask值,重新设置为0; newmode = mode & ~umask fd = open("test.txt", O_WRONLY | O_CREAT, 0666); if (fd == -1) ERR_EXIT("open error"); printf("open success.\n"); close(fd); return 0; }
输出为:
fileno(stdin) = 0
open success.
需要说明的是,在linux系统编程中使用的一些系统调用函数一般如果失败返回-1且会置全局变量errno为特定的错误码,可以使用perror打印,或者通过strerror(errno)打印错误提示。
参考:《APUE》
转载自http://blog.csdn.net/jnu_simba/article/details/8917854
相关文章推荐
- Linux系统编程——文件的打开与关闭
- Linux系统编程-文件打开关闭
- linux系统编程之文件与I/O(一):文件的打开关闭
- 三、Linux系统编程-文件和IO(一)文件的打开和关闭
- 暴风影音 打开 avi 视频文件时 explorer 出错 关闭
- Python打开和关闭文件
- 菜鸟入门——文件的打开的与关闭
- C# 实现打开和关闭可执行文件
- c++文件打开和关闭
- c# 打开exe文件与关闭exe文件 c#服务打开exe时候默认是没有窗体界面的
- Windows中打开和关闭FSO文件读写权限的方法
- asp新建,打开,写入,关闭文件
- VC菜单命令详解(文件打开、保存与关闭)
- VC6.0打开文件,出现“MSDEV.EXE-应用程序错误 遇到问题需要关闭
- 新窗口打开文件如果是不能识别的文件档自动关闭窗口的问题。
- php文件的打开,读取,关闭
- 请问如何关闭正在打开的文件。
- PHP在后台启动Microsoft Word、打开一个新文件、键入一些文本、保存该文件然后关闭应用程序
- php打开关闭文件
- Visual Studio 2008 中使用API打开file://形式的文件,关闭后文件被删除