热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux下的文件操作函数及creat用法

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

  编写Linux应用程序要用到如下工具:

  (1)编译器:GCC

  GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]。

  我们应该使用linux-gcc。

  (2)调试器:GDB

  gdb是一个用来调试C和C++程序的强力调试器,我们能通过它进行一系列调试工作,包括设置断点、观查变量、单步等。

  我们应该使用linux-gdb。

  (3)Make

   GNU Make的主要工作是读进一个文本文件,称为makefile。这个文件记录了哪些文件由哪些文件产生,用什么命令来产生。Make依靠此 makefile中的信息检查磁盘上的文件,如果目的文件的创建或修改时间比它的一个依靠文件旧的话,make就执行相应的命令,以便更新目的文件。

  Makefile中的编译规则要相应地使用linux-版本。

  (4)代码编辑

  可以使用传统的vi编辑器,但最好采用emacs软件,它具备语法高亮、版本控制等附带功能。

  在宿主机上用上述工具完成应用程序的开发后,可以通过如下途径将程序下载到目标板上运行:

  (1)通过串口通信协议rz将程序下载到目标板的文件系统中(感谢Linux提供了rz这样的一个命令);

  (2)通过ftp通信协议从宿主机上的ftp目录里将程序下载到目标板的文件系统中;

  (3)将程序拷入U盘,在目标机上mount U盘,运行U盘中的程序;

  (4)如果目标机Linux使用NFS文件系统,则可以直接将程序拷入到宿主机相应的目录内,在目标机Linux中可以直接使用。

  1. 文件编程

  Linux的文件操作API涉及到创建、打开、读写和关闭文件。

  创建

  int creat(const char *filename, mode_t mode);

  参数mode指定新建文件的存取权限, 【  www.Linuxidc.com 】它同umask一起决定文件的最终权限(mode&umask),其中umask代表了文件在创建时需要去掉的一些存取权限。umask可通过系统调用umask()来改变:

  int umask(int newmask);

  该调用将umask设置为newmask,然后返回旧的umask,它只影响读、写和执行权限。

  打开

  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以可读写方式打开文件。

  上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用 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 所指的文件并非为一目录, 则

  会令打开文件失败。此为 Linux2.2 以后特有的旗标,以避免一些系

  统安全问题。参数 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 值,表示成功, 【  www.Linuxidc.com 】只要有 一个权限被禁止则返回-1。

  错误代码:

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

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

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

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

  EINVAL 参数 mode 不正确。

  ENAMETOOLONG 参数 pathname 太长。

  ENOTDIR 参数 pathname 不是目录。

  ENOMEM 核心内存不足。

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

  EIO I/O 存取错误。

  读写

  在文件打开以后,我们才可对文件进行读写了,Linux中提供文件读写的系统调用是read、write函数:

  int read(int fd, const void *buf, size_t length);

  int write(int fd, const void *buf, size_t length);

  其中参数buf为指向缓冲区的指针,length为缓冲区的大小(以字节为单位)。函数read()实现从文件描述符fd所指定的文件中读取 length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。函数write实现将把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。

  以O_CREAT为标志的open实际上实现了文件创建的功能,因此,下面的函数等同creat()函数:

  int open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);

  定位

  对于随机文件,我们可以随机的指定位置读写,使用如下函数进行定位:

  int lseek(int fd, offset_t offset, int whence);

  lseek()将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。参数whence可使用下述值:

  SEEK_SET:相对文件开头

  SEEK_CUR:相对文件读写指针的当前位置

  SEEK_END:相对文件末尾

  offset可取负值,例如下述调用可将文件指针相对当前位置向前移动5个字节:

  lseek(fd, -5, SEEK_CUR);

  由于lseek函数的返回值为文件指针相对于文件头的位置,因此下列调用的返回值就是文件的长度:

  lseek(fd, 0, SEEK_END);

  关闭

  只要调用close就可以了,其中fd是我们要关闭的文件描述符:

  int close(int fd);

  下面我们来编写一个应用程序,在当前目录下创建用户可读写文件"example.txt",在其中写入"Hello World",关闭文件,再次打开它,读取其中的内容并输出在屏幕上:

  #include

  #include

  #include

  #include

  #define LENGTH 100

  main()

  {

  int fd, len;

  char str[LENGTH];

  fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);

  if (fd)

  {

  write(fd, "Hello, Software Weekly", strlen("Hello, software weekly"));

  close(fd);

  }

  fd = open("hello.txt", O_RDWR);

  len = read(fd, str, LENGTH);

  str[len] = '\0';

  printf("%s\n", str);

  close(fd);

  }


推荐阅读
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 本文详细探讨了Linux系统中`dd`命令的基础用法及其高级功能扩展。通过实例分析,介绍了如何利用`dd`进行数据复制、磁盘镜像创建以及文件系统恢复等操作,为用户提供了一套全面的技术指南。此外,文章还深入解析了`dd`命令的工作原理及其在实际应用场景中的优化技巧,帮助读者更好地掌握这一强大工具。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • Linux磁盘管理入门指南:MBR分区格式详解与安装步骤
    在 CentOS 7.x 环境下,本文详细介绍了 MBR 分区格式的基本概念及其安装步骤。实验中使用了 SAS 和 SATA 硬盘,其中 SAS 硬盘主要用于企业级应用和服务器,而 SATA 硬盘则广泛应用于个人计算机和低端服务器。文章通过具体操作示例,帮助读者更好地理解和掌握 Linux 磁盘管理的基本技能。 ... [详细]
  • 本文介绍了在Windows 10系统下使用VirtualBox虚拟机环境部署CentOS 7.2,并在其上安装Docker的具体步骤。针对宝塔面板在Docker容器中磁盘空间限制为8GB的问题,提供了详细的解决方案和优化建议,确保用户能够高效利用有限的存储资源。 ... [详细]
  • 在 CentOS 7 系统中,为了扩展根目录(/)的存储空间,本文详细介绍了从虚拟机硬盘扩容到文件系统调整的全过程。通过具体的操作步骤,成功解决了因空间不足导致的 GNOME 桌面无法正常登录的问题,为用户提供了一套完整的解决方案。 ... [详细]
  • 在Ubuntu和Linux Mint系统中安装LibreOffice 6.0的详细步骤
    本文详细介绍了在Ubuntu和Linux Mint操作系统上安装LibreOffice 6.0的具体步骤,包括必要的系统准备、软件源配置以及命令行操作,确保用户能够顺利安装并使用这一开源办公套件。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 如何在Linux中配置环境变量:命令与脚本详解
    请关注本头条号,每天坚持更新原创干货技术文章。当您在Linux命令行上键入命令时,您实际是在告诉shell运行指定名称的可执行文件。在Linux中,这些可执行程序通常位于系统上的几 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
author-avatar
李-诗-妍_519
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有