文件操作(Linux系统调用)

1.创建文件
int creat(const char *filename, mode_t mode)
filename:要创建的文件名(包含路径,缺省为当前路径)
mode:创建的文件的模式/访问权限
常见模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IRWXU 可读、可写、可执行
还可以直接使用数字来表示文件的访问权限:
可执行 1
可写 2
可读 4
上述三个值的和,如可读可写可执行 7(1+2+4)
无任何权限 0

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 #include <fcntl.h>
 7
 8  void  create_file(char *filename){
 9
10 /*创建的文件的属性0755表示:
11 文件所有者可读可写可执行;
12 文件所有者所在组用户可读可执行;
13 其他用户可读可执行*/
14     if(creat(filename,0755)<0){
15         printf("create file %s failure!\n",filename);
16         exit(EXIT_FAILURE);
17     }else{
18         printf("create file %s success!\n",filename);
19     }
20 }
21
22 int main(int argc,char *argv[]){
23     int i;
24     if(argc<2){
25         perror("you haven‘t input the filename,please try again!\n");
26         exit(EXIT_FAILURE);
27     }
28
29     for(i=1;i<argc;i++){
30         create_file(argv[i]);
31     }
32
33     exit(EXIT_SUCCESS);
34 }2.打开文件int open(const char *pathname, int flags)int open(const char *pathname, int flags, mode_t mode)常见打开标志(flags):O_RDONLY 只读方式打开O_WRONLY 只写方式打开O_RDWR 读写方式打开O_APPEND 追加方式打开O_CREATE 创建一个文件O_NOBLOCK 非阻塞方式打开如果使用了O_CREATE标志,则必须指定mode来表示文件的访问权限。
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 #include <fcntl.h>
 7
 8 int main(int argc ,char *argv[]){
 9     int fd;
10     if(argc<2){
11         puts("please input the open file pathname!\n");
12         exit(1);
13     }
14
15     //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755
16     //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错.
17     //所以fd=open(argv[1],O_RDWR),仅仅只是打开指定文件
18     if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){
19         perror("open file failure!\n");
20         exit(1);
21     }else{
22         printf("open file %d  success!\n",fd);
23
24     }
25     close(fd);
26     exit(0);
27
28 }3.关闭文件int close(int fd)fd:文件描述符(一个非负整数)4.读文件int read(int fd, const void *buf, size_t length)从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回实际读取的字节数。5.写文件int write(int fd, const void *buf, size_t length)把buf所指向的缓冲区中的length个字节写到文件描述符fd所指向的文件中,返回实际写入的字节数。6.定位文件(移动文件指针)int lseek(int fd, offset_t offset, int whence)将文件读写指针相对whence移动offset个字节。操作成功,则返回文件指针相对于文件头的位置。whence可以取下述值:SEEK_SET:相对文件开头SEEK_CUR:相对文件读写指针的当前位置SEEK_END:相对文件末尾offset可取负值,表示向前移动。7.访问权限判断int access(const char *pathname, int mode)pathname:文件名称mode:要判断的访问权限,可以取下面的值或者它们的组合。R_OK:文件可读,W_OK:文件可写,X_OK:文件可执行,F_OK:文件存在。返回值:当我们测试成功时,函数返回0,否则如果有一个条件不符合,返回-1。
 1 #include <sys/types.h>
 2 #include <sys/stat.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5 #include <errno.h>
 6
 7 #define BUFFER_SIZE 1024
 8
 9 int main(int argc,char **argv)
10 {
11   int from_fd,to_fd;
12   int bytes_read,bytes_write;
13   char buffer[BUFFER_SIZE];
14   char *ptr;
15
16   if(argc!=3)
17   {
18     fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);
19     exit(1);
20   }
21
22   /* 打开源文件 */
23   if((from_fd=open(argv[1],O_RDONLY))==-1)
24   {
25     fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
26     exit(1);
27   }
28
29   /* 创建目的文件 */
30   if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
31   {
32     fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));
33     exit(1);
34   }
35
36   /* 以下代码是一个经典的拷贝文件的代码 */
37   while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
38   {
39     /* 一个致命的错误发生了 */
40     if((bytes_read==-1)&&(errno!=EINTR)) break;
41     else if(bytes_read>0)
42     {
43       ptr=buffer;
44       while(bytes_write=write(to_fd,ptr,bytes_read))
45       {
46         /* 一个致命错误发生了 */
47         if((bytes_write==-1)&&(errno!=EINTR))break;
48         /* 写完了所有读的字节 */
49         else if(bytes_write==bytes_read) break;
50         /* 只写了一部分,继续写 */
51         else if(bytes_write>0)
52         {
53           ptr+=bytes_write;
54           bytes_read-=bytes_write;
55         }
56       }
57       /* 写的时候发生的致命错误 */
58       if(bytes_write==-1)break;
59     }
60   }
61   close(from_fd);
62   close(to_fd);
63   exit(0);
64 }
时间: 2024-10-13 22:22:18

文件操作(Linux系统调用)的相关文章

Linux C高级编程——文件操作之系统调用

Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神的无限的! 库函数是一些完成特定功能的函数,一般由某个标准组织制作发布,并形成一定的标准.使用库函数编写的函数一般可以应用于不同的平台而不需要做任何修改,具有很好的可移植性. 系统调用函数与操作系统直接相关,不同的操作系统所使用的系统调用可能不太一样,因此,如果两个操作系统差异很大,系统调用函数的可移植性就不高.例如windows采用的系统调用的应用程序不能直接在Linux下编译运行. 之所以使用系统调用是因为系统资源

文件IO(Linux系统调用)

与操作系统有关,所有文件都可操作,无缓冲区文件IO:常规文件,目录,字符设备,块设备,管道,套接口,符号连接 通过文件描述符访问文件,最多可打开1024个文件,文件描述符最大为1023. 标准输入.标准输出.标准出错 由shell默认打开,分别为0/1/2. 当打开一个文件时,内核会返回一个非负整数(一定是最小的且没有用过的),即文件描述符,用来代表打开的文件. int open(const char *pathname,int flags); int open(const char *path

3)Linux程序设计入门--文件操作

3)Linux程序设计入门--文件操作 Linux下文件的操作 前言: 我们在这一节将要讨论linux下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 1.文件的创建和读写 我假设你已经知道了标准级的文件操作的各个函数(fopen,fread,fwrite等等).当然 如果你不清楚的话也不要着急.我们讨论的系统级的文件操作实际上是为标准级文件操作 服务的. 当我们需要打开一个文件进行读写操作的时候,我们可以使用系统调用函数open.使用完 成以后我们调用另外一个

Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误

Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作 read系统调用测试 /************************************************************************* > File Name: read.c > Author: > Mail: > Created Time: Tue 10 Feb 2015 01:23:58 AM PST **********************************

Linux C 文件操作 -- 系统调用(open(),read()...) 和 标准I/O库(fopen(),fread()...)

一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等.但是在Linux中,文件的概念还远不止于这些,在Linux中,一切(或几乎一切)都是文件.文件包括很多的内容,例如:大家知道的普通文件是文件,目录也是一个文件,设备也是一个文件,管道也是一个文件等等.对于目录.设备这些的操作也可以完全等同于对纯文本文件的操作,这也是Linux非常成功的特性之一吧.

【Linux】文件操作系统调用

一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的文件描述符,即标准输入.标准输出.和标准错误,他们的文件描述符的值分别为0.1.2. 文件描述符是文件系统中连接用户空间和内核空间的枢纽.当打开一个或者创建一个文件时,内核空间创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程,进程用这个文件描述符来对文件进行操作. 二. 打开.创建文件o

Linux 文件操作总结

http://blog.163.com/he_junwei/blog/static/19793764620152592737741/ ioctl?? lseek?? 文件是linux中的一个重要概念.在Linux中,一切(几乎一切)都是文件.简单的说,C中基本的的printf()函数,scanf()函数,其实都属于文件操作. 对于文件操作,虽然都是通过函数调用的方式实现,却还是能分为两类:系统调用和库函数. 这篇文章将先介绍linux中文件的概念,系统调用和库函数的概念 ,然后具体的讨论两种方式

linux程序设计——文件操作(第三章)

第三章    文件操作 3.1 linux文件结构 与UNIX一样,linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而一致的接口.在linux中,一切都是文件. 这意味着,通常程序可以像使用文件那样使用磁盘文件.串行口.打印机等等. 目录也是文件,但它是一种特殊类型的文件.在现代UNIX(包括linux)版本中,即使是超级用户可能也不再被允许直接对目录进行写左操作了.所有用户通常都使用上层的opendir/readdir接口来读取目录,而无需了解特定系统中目录

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)

Linux下的IO/文件操作练习,知识虽然简单 但是往往基础容易被忽略,偶尔的练习是有必要的. 练习printf /************************************************************************* > File Name: printf.c > Author: > Mail: > Created Time: Wed 11 Feb 2015 01:08:15 AM PST ***********************