Linux中C语言open函数打开或创建文件详细讲解

合集下载

c语言open()介绍

c语言open()介绍

c语⾔open()介绍2013-09-0914:40:13 1. 头⽂件:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>2. 定义函数:int open(const char * pathname, int flags);int open(const char * pathname, int flags, mode_t mode);3. 函数说明:3.1 参数pathname指向欲打开的⽂件路径字符串。

下列是参数flags 所能使⽤的旗标:O_RDONLY 以只读⽅式打开⽂件。

O_WRONLY 以只写⽅式打开⽂件。

O_RDWR 以可读写⽅式打开⽂件。

上述三种旗标是互斥的,也就是不可同时使⽤,但可与下列的旗标利⽤OR(|)运算符组合。

O_CREAT 若欲打开的⽂件不存在则⾃动建⽴该⽂件。

O_EXCL 如果O_CREAT也被设置,此指令会去检查⽂件是否存在,⽂件若不存在则建⽴该⽂件,否则将导致打开⽂件错误。

此外,若O_CREAT与O_EXCL同时设置,并且欲打开的⽂件为符号连接,则会打开⽂件失败。

O_NOCTTY 如果欲打开的⽂件为终端机设备时。

则不会将该终端机当成进程控制终端机。

O_TRUNC 若⽂件存在并且以可写的⽅式打开时,此旗标会令⽂件长度清为0。

⽽原来存于该⽂件的资料也会消失。

O_APPEND 当读写⽂件时会从⽂件尾开始移动,也就是所写⼊的数据会以附加的⽅式加⼊到⽂件后⾯。

O_NONBLOCK 以不可阻断的⽅式打开⽂件,也就是⽆论有⽆数据读取或等待,都会⽴即返回进程之中。

O_NDELAY 同O_NONBLOCK。

O_SYNC 以同步的⽅式打开⽂件。

O_NOFOLLOW 如果参数pathname所指的⽂件为⼀符号连接,则会令打开⽂件失败。

O_DIRECTORY 如果参数pathname所指的⽂件并⾮为⼀⽬录,则会令打开⽂件失败。

Linux下C语言编程--文件的操作

Linux下C语言编程--文件的操作

Linux下C语言编程--文件/目录的操作1.文件的创建和读写2.文件的各个属性3.目录文件的操作1。

文件的创建和读写我假设你已经知道了标准级的文件操作的各个函数(fopen,fread,fwrite等等).当然如果你不清楚的话也不要着急.我们讨论的系统级的文件操作实际上是为标准级文件操作服务的. 当我们需要打开一个文件进行读写操作的时候,我们可以使用系统调用函数open.使用完成以后我们调用另外一个close函数进行关闭操作.int open(const char *pathname,int flags);int open(const char *pathname,int flags,mode_t mode);int close(int fd);open函数有两个形式.其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在当前路径下面).flags可以去下面的一个值或者是几个值的组合.O_RDONLY:以只读的方式打开文件.O_WRONLY:以只写的方式打开文件.O_RDWR:以读写的方式打开文件.O_APPEND:以追加的方式打开文件.O_CREA T:创建一个文件.O_EXEC:如果使用了O_CREA T而且文件已经存在,就会发生一个错误.O_NOBLOCK:以非阻塞的方式打开一个文件.O_TRUNC:如果文件已经存在,则删除文件的内容.前面三个标志只能使用任意的一个.如果使用了O_CREA TE标志,那么我们要使用open的第二种形式.还要指定mode标志,用来表示文件的访问权限.mode可以是以下情况的组合.S_IRUSR 用户可以读S_IWUSR 用户可以写S_IXUSR 用户可以执行S_IRWXU 用户可以读写执行S_IRGRP 组可以读S_IWGRP 组可以写S_IXGRP 组可以执行S_IRWXG 组可以读写执行S_IROTH 其他人可以读S_IWOTH 其他人可以写S_IXOTH 其他人可以执行S_IRWXO 其他人可以读写执行S_ISUID 设置用户执行ID S_ISGID 设置组的执行ID我们也可以用数字来代表各个位的标志.Linux总共用5个数字来表示文件的各种权限. 00000.第一位表示设置用户ID.第二位表示设置组ID,第三位表示用户自己的权限位,第四位表示组的权限,最后一位表示其他人的权限.每个数字可以取1(执行权限),2(写权限),4(读权限),0(什么也没有)或者是这几个值的和.比如我们要创建一个用户读写执行,组没有权限,其他人读执行的文件.设置用户ID位那么我们可以使用的模式是--1(设置用户ID)0(组没有设置)7(1+2+4)0(没有权限,使用缺省)5(1+4)即10705:open("temp",O_CREA T,10705);如果我们打开文件成功,open会返回一个文件描述符.我们以后对文件的所有操作就可以对这个文件描述符进行操作了.当我们操作完成以后,我们要关闭文件了,只要调用close就可以了,其中fd是我们要关闭的文件描述符.文件打开了以后,我们就要对文件进行读写了.我们可以调用函数read和write进行文件的读写.ssize_t read(int fd, void *buffer,size_t count);ssize_t write(int fd, const void *buffer,size_t count);fd是我们要进行读写操作的文件描述符,buffer是我们要写入文件内容或读出文件内容的内存地址.count是我们要读写的字节数.对于普通的文件read从指定的文件(fd)中读取count字节到buffer缓冲区中(记住我们必须提供一个足够大的缓冲区),同时返回count.如果read读到了文件的结尾或者被一个信号所中断,返回值会小于count.如果是由信号中断引起返回,而且没有返回数据,read会返回-1,且设置errno为EINTR.当程序读到了文件结尾的时候,read会返回0.write从buffer中写count字节到文件fd中,成功时返回实际所写的字节数.下面我们学习一个实例,这个实例用来拷贝文件.#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#define BUFFER_SIZE 1024int main(int argc,char **argv){int from_fd,to_fd;int bytes_read,bytes_write;char buffer[BUFFER_SIZE];char *ptr;if(argc!=3){fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]);exit(1);}/* 打开源文件*/if((from_fd=open(argv[1],O_RDONLY))==-1){fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno));exit(1);}/* 创建目的文件*/if((to_fd=open(argv[2],O_WRONLY|O_CREA T,S_IRUSR|S_IWUSR))==-1) {fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));exit(1);}/* 以下代码是一个经典的拷贝文件的代码*/while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){/* 一个致命的错误发生了*/if((bytes_read==-1)&&(errno!=EINTR)) break;else if(bytes_read>0){ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)){/* 一个致命错误发生了*/if((bytes_write==-1)&&(errno!=EINTR))break;/* 写完了所有读的字节*/else if(bytes_write==bytes_read) break;/* 只写了一部分,继续写*/else if(bytes_write>0){ptr+=bytes_write;bytes_read-=bytes_write;}}/* 写的时候发生的致命错误*/if(bytes_write==-1)break;}}close(from_fd);close(to_fd);exit(0);}2。

Linux管道编程技术:dup函数,dup2函数,open函数详解

Linux管道编程技术:dup函数,dup2函数,open函数详解

Linux管道编程技术:dup函数,dup2函数,open函数详解Linux管道编程技术:dup函数,dup2函数,open函数详解分类: C&Cplusplus Linux 2012-11-06 08:46 4666人阅读评论(1) 收藏举报(一)dup函数,dup2()函数1.dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。

它们经常用来重定向进程的stdin、stdout和stderr。

这两个函数的原形如下:#include <unistd.h>int dup( int oldfd );int dup2( int oldfd, int targetfd )利用函数dup,我们可以复制一个描述符。

传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。

这意味着,这两个描述符共享同一个数据结构。

例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的。

下面是用来说明dup函数使用方法的代码片段:int fd1, fd2;...fd2 = dup( fd1 );需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,子进程也同样会收到一个复制出来的描述符。

dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。

dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。

下面我们用一段代码加以说明:int oldfd;oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );dup2( oldfd, 1 );close( oldfd );本例中,我们打开了一个新文件,称为“app_log”,并收到一个文件描述符,该描述符叫做fd1。

Linux常用C函数open和read以及write的使用说明

Linux常用C函数open和read以及write的使用说明

Linux‎常用C函数‎o pen和‎r ead以‎及writ‎e的使用说‎明2008-03-19 13:56open(打开文件)相关函数read,write‎,fcntl‎,close‎,link,stat,umask‎,unlin‎k,fopen‎表头文件 #inclu‎d e<sys/types‎.h>#inclu‎d e<sys/stat.h>#inclu‎d e<fcntl‎.h>定义函数 int open( const‎char * pathn‎a me, int flags‎);int open( const‎char * pathn‎a me,int flags‎, mode_‎t mode);函数说明参数pat‎h name‎指向欲打开‎的文件路径‎字符串。

下列是参数‎f lags‎所能使用的‎旗标:O_RDO‎N LY 以只读方式‎打开文件O_WRO‎N LY 以只写方式‎打开文件O_RDW‎R以可读写方‎式打开文件‎。

上述三种旗‎标是互斥的‎,也就是不可‎同时使用,但可与下列‎的旗标利用‎O R(|)运算符组合‎。

O_CRE‎A T 若欲打开的‎文件不存在‎则自动建立‎该文件。

O_EXC‎L如果O_C‎R EAT 也被设置,此指令会去‎检查文件是‎否存在。

文件若不存‎在则建立该‎文件,否则将导致‎打开文件错‎误。

此外,若O_CR‎E AT与O‎_EXCL‎同时设置,并且欲打开‎的文件为符‎号连接,则会打开文‎件失败。

O_NOC‎T TY 如果欲打开‎的文件为终‎端机设备时‎,则不会将该‎终端机当成‎进程控制终‎端机。

O_TRU‎N C 若文件存在‎并且以可写‎的方式打开‎时,此旗标会令‎文件长度清‎为0,而原来存于‎该文件的资‎料也会消失‎。

O_APP‎E ND 当读写文件‎时会从文件‎尾开始移动‎,也就是所写‎入的数据会‎以附加的方‎式加入到文‎件后面。

c语言open的使用用例

c语言open的使用用例

c语言open的使用用例在C语言中,open函数是一个非常常用的函数,它用于打开文件并返回一个文件描述符。

在本文中,我们将探讨open函数的使用方法和一些常见的应用场景。

一、open函数的基本用法open函数的原型如下:```cint open(const char *pathname, int flags);```其中,pathname是要打开的文件的路径名,flags表示打开文件的方式和权限。

open函数返回一个非负整数作为文件描述符,如果出错则返回-1。

下面是一个简单的例子,演示了如何使用open函数打开一个文件:```c#include <fcntl.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return -1;}printf("文件描述符:%d\n", fd);// 其他操作...close(fd);return 0;}```在上面的例子中,我们使用open函数打开了名为example.txt的文件,并以只读方式打开。

如果打开文件失败,我们使用perror函数打印出错信息,并返回-1。

如果打开成功,则打印文件描述符,并进行其他操作后关闭文件。

二、open函数的常见用例1. 打开文件并读取内容我们可以使用open函数打开一个文件,然后使用read函数读取文件的内容。

下面是一个示例代码:```c#include <fcntl.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#define BUFFER_SIZE 1024int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return -1;}char buffer[BUFFER_SIZE];ssize_t nread;while ((nread = read(fd, buffer, BUFFER_SIZE)) > 0) { // 处理读取到的数据// ...}if (nread == -1) {perror("read");return -1;}close(fd);return 0;}```在上面的例子中,我们打开了example.txt文件,并使用read函数循环读取文件的内容。

C语言的f(open)函数(文件操作读写)

C语言的f(open)函数(文件操作读写)

C语⾔的f(open)函数(⽂件操作读写)头⽂件:#include <stdio.h>fopen()是⼀个常⽤的函数,⽤来以指定的⽅式打开⽂件,其原型为:FILE * fopen(const char * path, const char * mode);【参数】path为包含了路径的⽂件名,mode为⽂件打开⽅式。

mode有以下⼏种⽅式:打开⽅说明式r以只读⽅式打开⽂件,该⽂件必须存在。

r+以读/写⽅式打开⽂件,该⽂件必须存在。

rb+以读/写⽅式打开⼀个⼆进制⽂件,只允许读/写数据。

rt+以读/写⽅式打开⼀个⽂本⽂件,允许读和写。

w打开只写⽂件,若⽂件存在则长度清为0,即该⽂件内容消失,若不存在则创建该⽂件。

w+打开可读/写⽂件,若⽂件存在则⽂件长度清为零,即该⽂件内容会消失。

若⽂件不存在则建⽴该⽂件。

a以附加的⽅式打开只写⽂件。

若⽂件不存在,则会建⽴该⽂件,如果⽂件存在,写⼊的数据会被加到⽂件尾,即⽂件原先的内容会被保留(EOF符保留)。

a+以附加⽅式打开可读/写的⽂件。

若⽂件不存在,则会建⽴该⽂件,如果⽂件存在,则写⼊的数据会被加到⽂件尾后,即⽂件原先的内容会被保留(原来的EOF符不保留)。

wb以只写⽅式打开或新建⼀个⼆进制⽂件,只允许写数据。

wb+以读/写⽅式打开或建⽴⼀个⼆进制⽂件,允许读和写。

wt+以读/写⽅式打开或建⽴⼀个⽂本⽂件,允许读写。

at+以读/写⽅式打开⼀个⽂本⽂件,允许读或在⽂本末追加数据。

ab+以读/写⽅式打开⼀个⼆进制⽂件,允许读或在⽂件末追加数据。

在POSIX 系统,包含Linux 下都会忽略 b 字符。

由fopen()所建⽴的新⽂件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此⽂件权限也会参考umask 值。

⼆进制和⽂本模式的区别:在windows系统中,⽂本模式下,⽂件以"\r\n"代表换⾏。

linux中open用法 -回复

linux中open用法 -回复

linux中open用法-回复标题:Linux中open函数的用法与详解引言:在Linux操作系统中,open函数是一个非常常用的系统调用函数,用于打开或创建一个文件。

它提供了丰富的选项和强大的功能,通过合理的调用和使用,可以帮助开发者更好地操作文件系统。

本文将一步一步地回答关于Linux中open函数的用法和详解,旨在帮助读者更深入地理解该函数并灵活运用。

第一部分:open函数的基本概念和原型(200字)首先,让我们来了解一下open函数的基本概念和原型。

在Linux中,open 函数的原型如下:int open(const char *pathname, int flags);这个函数接受两个参数,第一个参数pathname是一个字符串,表示欲打开或创建的文件路径,它可以是绝对路径也可以是相对路径;第二个参数flags是一个整数,表示打开文件的选项和权限。

第二部分:打开文件的常用选项(500字)接下来,我们将详细介绍open函数常用的选项,这些选项将定义打开文件时的行为和属性。

1. O_RDONLY、O_WRONLY、O_RDWR:这些选项用于定义打开文件的模式,分别表示只读、只写和读写模式。

2. O_CREAT: 如果文件不存在,则创建一个新文件。

这个选项需要提供一个额外的权限参数mode,用于定义文件的权限。

3. O_EXCL: 与O_CREAT一起使用,如果文件已经存在,将导致open函数失败。

4. O_TRUNC: 如果文件已经存在且成功打开,将截断文件长度为0。

5. O_APPEND: 在文件末尾追加数据,而不是覆盖原有内容。

6. O_SYNC: 使用同步I/O方式打开文件,写入操作将立即完成。

第三部分:权限参数和文件描述符(500字)在open函数中,权限参数mode用于指定文件的访问权限。

Linux系统中,文件权限分为三个级别:所有者、用户组和其他用户。

每个级别都可以设置读(r)、写(w)和执行(x)的权限。

系统调用open()的基本过程

系统调用open()的基本过程

系统调用open()的基本过程open()系统调用是Linux操作系统用于打开文件或创建文件的函数之一,其作用是根据指定的文件名和模式打开一个文件并返回一个文件描述符。

操作系统中的文件是对外部设备上数据的一种抽象,通过文件描述符进行操作,文件描述符可以看做是对文件进行的操作的句柄。

在本文中,我们将详细介绍open()系统调用的基本过程。

用户程序调用open()系统调用时,需要提供所需打开文件的文件名(路径名称)、打开方式、文件权限等参数。

在Linux中,文件路径名称可以是绝对路径和相对路径,例如:```int fd = open( "/home/test.txt", O_RDWR, 0666 );```以上调用表明:文件路径名称是“/home/test.txt”,打开模式是“O_RDWR”(读写方式),权限是“0666”(所有用户均可读写)。

2. 操作系统内核接收系统调用在用户程序调用open()系统调用之后,操作系统内核首先需要接收该系统调用,执行系统调用的代码在Linux内核中。

3. 根据文件路径名称查找文件内核根据open()系统调用中提供的文件路径名称,查找文件系统中是否存在该文件。

文件系统是指Linux内核中对存储设备上的文件和目录进行管理的机制,不同的文件系统可能有不同的组织结构和实现方式。

4. 检查文件是否可用当内核找到路径名称对应的文件时,需要检查文件是否存在、可读、可写、可执行等。

如果文件不存在或读取或写入权限被撤销,则open()系统调用返回错误信息。

5. 创建或打开文件如果内核检查通过,说明文件可用,open()系统调用开始执行打开或创建文件的操作。

- 如果文件存在,打开文件,并返回到该文件的文件描述符。

- 如果文件不存在,根据open()系统调用中提供的权限和打开方式,创建一个新的文件,并返回到新文件的文件描述符。

内核会记录文件描述符与文件之间的关系,同时也会为该文件分配对应的inode节点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux中C语言open函数打开或创建文件详细讲解
头文件:
#include
#include
#include
函数原型:
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
作用:以各种方式打开文件
返回值:返回打开的文件句柄,-1打开失败
函数说明参数pathname指向欲打开的文件路径字符串,既可以是相对路径也可以是绝对路径。

flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or
下列是参数flags所能使用的旗标:
必选项:以下三个常数中必须指定一个,且仅允许指定一个。

O_RDONLY以只读方式打开文件
O_WRONLY以只写方式打开文件
O_RDWR以可读写方式打开文件。

上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。

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

O_CREAT若欲打开的文件不存在则自动建立该文件。

O_EXCL如果O_CREAT也被设置,此指令会去检查文件是否存在。

文件若不存在则建立该文件,否则将导致打开文件错误。

此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。

O_NOCTTY如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。

O_TRUNC若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。

O_APPEND当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。

O_NONBLOCK以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。

O_NDELAY同O_NONBLOCK。

O_SYNC以同步的方式打开文件。

O_NOFOLLOW如果参数pathname所指的文件为一符号连接,则会令打开文件失败。

O_DIRECTORY如果参数pathname所指的文件并非为一目录,则会令打开文件失败。

此为Linux2.2以后特有的旗标,以避免一些系统安全问题。

第三个参数mode指定文件权限,可以用八进制数表示,比如0644表示
-rw-r--r--,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,参数mode则有下列数种组合,只有在建立新文件时才会生效,文件权限由open 的mode参数和当前进程的umask掩码共同决定,因此该文件权限应该为(mode-umaks)。

S_IRWXU00700权限,代表该文件所有者具有可读、可写及可执行的权限。

S_IRUSR或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。

S_IWUSR或S_IWRITE,00200权限,代表该文件所有者具有可写入的权限。

S_IXUSR或S_IEXEC,00100权限,代表该文件所有者具有可执行的权限。

S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。

S_IRGRP 00040权限,代表该文件用户组具有可读的权限。

S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。

S_IXGRP 00010权限,代表该文件用户组具有可执行的权限。

S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。

S_IROTH 00004权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。

S_IXOTH 00001权限,代表其他用户具有可执行的权限。

返回值若所有欲核查的权限都通过了检查则返回0值,表示成功,只要有一个权限被禁止则返回-1。

错误代码EEXIST参数pathname所指的文件已存在,却使用了
O_CREAT和O_EXCL旗标。

EACCESS参数pathname所指的文件不符合所要求测试的权限。

EROFS欲测试写入权限的文件存在于只读文件系统内。

EFAULT参数pathname指针超出可存取内存空间。

EINVAL参数mode不正确。

ENAMETOOLONG参数pathname太长。

ENOTDIR参数pathname不是目录。

ENOMEM核心内存不足。

ELOOP参数pathname有过多符号连接问题。

EIO I/O 存取错误。

相关文档
最新文档