文件编程之Linux下系统调用

说明:
linux下文件编程可使用两种方法:
****linux系统调用
****C语言库函数

前者依赖于linux系统,后者与操作系统是独立的。
在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。

这里首先记录下Linux下系统调用操作文件编程的学习过程。
函数原型:
1、系统调用--创建:
int create(const char *filename, mode_t mode);

filename为要创建的文件名(包含路径,缺省为当前路径);
mode为创建模式。

模式可用数字来表示:
可执行为1;
可写为2;
可读为4;
上述和,如可写可读为6,对应文件权限。

文件描述符:在linux系统中,所有打开的文件都对应一个文件描述符。

2、系统调用--打开:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

pathname为要打开的文件名(包含路径,缺省为当前路径)
flags为打开标志,常见的打开标志:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_APPEND 追加方式
O_CREAT 创建一个文件
O_NOBLOCK 非阻塞方式

如果使用了O_CREAT标志,则使用带mode的open函数,这时要指定文件权限。

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);

功能:把length个字节从buf指向的缓冲区中写到fd所指向的文件中,
返回实际写入的字节数。

6、系统调用--定位
int lseek(int fd, offset_t offset, int whence);

功能:将文件读写指针相对whence移动offset个字节。
操作成功,返回文件指针相对于文件头的位置。

whence可用下数值:
SEEK_SET 相对文件开头
SEEK_CUR 相对文件读写指针的当前位置
SEEK_END 相对文件末尾

offset可取负值,表示向前移动。

计算文件长度时,可用 lseek(fd, 0, SEEK_END);

7、系统调用--访问判断
int access(const char *pathname, int mode);

功能:判断文件是否可以进行某种操作。

mode可取R_OK可读、W_OK可写、X_OK可执行、F_OK文件存在。

返回值:测试成功时,返回0,否则返回-1。

代码实例如下:

 1 ****************************************
 2     功能:实现文件的复制工作;
 3           练习文件操作的系统调用函数的使用
 4                     如:open、close、read、write、lseek
 5         编译:gcc linux_file_cp.c
 6         执行:./a.out src_file dst_file
 7         说明:src_file为保存有原来内容的文件
 8               dst_file为要创建的文件。
 9     日期:2015.9.22
10 *****************************************/
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <fcntl.h>
18
19 #define BUFFER_SIZE 1024
20
21 int main(int argc,char **argv)
22 {
23     int from_fd;
24     int to_fd;
25     long file_len=0;
26     char buffer[BUFFER_SIZE];
27     char *ptr;
28
29     /*判断入参*/
30     if(argc!=3)
31     {
32         printf("Usage:%s fromfile tofile\n",argv[0]);
33         exit(1);
34     }
35
36 /* 打开源文件 */
37 if((from_fd=open(argv[1], O_RDONLY)) == -1)
38 {
39     printf("Open %s Error\n",argv[1]);
40     exit(1);
41 }
42
43 /* 创建目的文件 */
44 /*如果目的文件不存在,则创建*/
45 if((to_fd=open(argv[2], O_RDWR | O_CREAT, 0666)) == -1)
46 {
47     printf("Open %s Error\n",argv[2]);
48     exit(1);
49 }
50
51 /*测得文件大小*/
52 file_len = lseek(from_fd, 0L, SEEK_END);
53 lseek(from_fd, 0L, SEEK_SET);
54 printf("from file size is= %d\n",file_len);
55
56 /*进行文件拷贝*/
57 while((read(from_fd, buffer, BUFFER_SIZE)) != 0)
58 {
59     write(to_fd, buffer, file_len);
60 }
61 close(from_fd);
62 close(to_fd);
63 exit(0);
64 } 
时间: 2024-11-08 03:27:47

文件编程之Linux下系统调用的相关文章

Linux入门基础教程之Linux下软件安装

Linux入门基础教程之Linux下软件安装 一.在线安装: sudo apt-get install 即可安装 如果在安装完后无法用Tab键补全命令,可以执行: source ~/.zshrc APT(Advanced Packaging Tool), 包括apt-get, apt-cache, apt-cdrom等工具,APT可以自动下载,配置,安装二进制或者源代码格式的软件包,因此简化了Unix系统上管理软件的过程,Ubuntu是Debian的发行版.Debian使用的包管理工具是dpkg

windows下的txt文件传到Linux下中文乱码问题

之所以出现乱码是因为所压缩的文件中,有的文件是以中文命名.而在windows下中文的编码一般为gbk,而linux下中文的编码一般为utf8,所以在windows下正常打开的文件,到linux下很可能会出现乱码. 解决办法为:使用命令iconv对文件内容编码进行转换.例如我有一个文件"linux常用命令"在windows下打开正常,而在linux下打开则会乱码,办法为在终端输入: iconv -f gbk -t utf8 inputfile > outputifile 注意:ou

多线程编程之Linux环境下的多线程(二)

上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了三种基本的同步机制:互斥.读写锁.条件变量.下面分别针对这三种机制进行说明: 一.线程互斥 互斥意味着具有“排它性”,即两个线程不能同时进入被互斥保护的代码.Linux下可以通过pthread_mutex_t 定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互斥的部分,在进入时先得到互斥体,如果没有得到互斥体,表明

linux下系统调用、API、系统命令,内核函数的区别与联系

1.系统调用: 应用程序和内核间的桥梁,是应用程序访问内核的入口点;但通常情况下,应用程序通过操作系统提供的API进行编程而不是使用系统调用直接编程; linux的全部系统调用加起来大约只有250个左右. 2.API: API常以c库(libc)的形式提供,c库提供了绝大部分API,每个系统调用在c库中都有对应的封装函数(通常封装函数与系统调用的名称相同).系统调用与c库函数并不是一一对应的,有些c库函数可能使用多个系统调用来实现,也有可能多个c库函数使用同一个系统调用来实现,也有些c库函数不使

Linux 下系统调用的三种方法

系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数.下面介绍Linux 下三种发生系统调用的方法: 通过 glibc 提供的库函数 glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库.glibc 为程序员提供丰富的 API(Application Programming Interfac

hadoop学习;大数据集在HDFS中存为单个文件;安装linux下eclipse出错解决;查看.class文件插件

sudo apt-get install eclipse 安装后打开eclipse,提示出错 An error has occurred. See the log file /home/pengeorge/.eclipse/org.eclipse.platform_3.7.0_155965261/configuration/1342406790169.log. 查看错误日志然后解决 打开log文件,看到以下的错误 !SESSION 2012-07-16 10:46:29.992 --------

Intellij idea史上最简单的教程之Linux下安装与破解Intellij idea2017

一.前言 这一节我们介绍在Linux下如何安装与破解Intellij idea2017.现在有很多公司开发环境都是Linux,所以掌握在Linux环境下使用Idea办公也是咱们必须得掌握的技能. 下载地址:https://www.jetbrains.com/idea/download/#section=linux 记住我们下载的是Ultimate(旗舰版),不是Community(社区版).Ultimate(旗舰版)是收费的版本,本文主要是针对这个版本的安装与破解的教程.所以各位童鞋别下错了哟.

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 &amp;&amp; Linux下的ZipArchive配置开启压缩

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表示处理的

将Windows下的文件同步到Linux下

需求:把Windows下的某些文件自动传送到Linux指定目录下 实现: 1. Windows下安装 WinSCP工具,并把Liunx服务器信息保存 2. 编写脚本,实现双击工具就把Windows下的文件上传到Linux下, ========================== copyFile.txt =====================================START=========== option echo offoption batch onoption confir