Linux c编程(20210608)

简介: Linux c编程(20210608)

Linux的文件基础操作

打开、关闭、创建、写入、读出操作。

Linux通过调用相关的文件I/O函数来完成相应的操作。(open、create、write)

这些函数通常被称为"不带缓冲的I/O操作函数"。

常见的文件操作流程:

任何被打开的文件在操作完成后,必须被关闭,否则容易出现错误。

打开和关闭文件

  1. 打开open函数,用于在Linux中打开一个文件如果文件不存在,则先创建一个,然后打开如果操作成功,返回文件对应的文件描述符,如果操作失败,返回-1对open函数标准调用格式的说明:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open(const char* pathname,int flags);//打开一个现有文件
int open(const char*pathname,int flags,mode_t mode);//如果打开的文件不存在,则先创建
//fcntl.h,是unix标准中通用的头文件,其中包含的相关函数有 open,fcntl,shutdown,unlink,fclose等!
//sys/types.h 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。
//sys/stat.h 是unix/linux系统定义文件状态所在的伪标准头文件。
  1. 对open函数的各个参数和应用实例的说明:
  • pathname参数
    用于传递包含了路径的完整文件名称
  • flags参数用于指定打开文件的方式,常用的三种标志
  • 只读:O_RDONLY,通常定义为0
  • 只写:O_WRONLY,通常定义为1
  • 读写:O_RDWR,通常定义为2
  • 在对一个文件进行相应的操作的时候,必须要注意文件本身的权限,对一个文件进行操作权限不够的操作将会返回一个错误
    flags参数中以上三个参数是必须唯一的,这些关键字之间不能用"OR"来连接,只能选择其中一个。
    flags还可以使用以下可选的参数:

    表中给出的标志可以混合使用,各标志之间用 "|"符号连接。(有些标志可以在文件打开后利用fcntl函数进行修改)
    纠正:应为O_CREAT

实际上,第一个参数为int型参数,该数的每位对应一个操作,符号"|“是将它们按位或,即加起来,使得需要操作的位被置为"1”

  • mode参数说明
    如果仅仅需要打开一个文件,可以不使用第三个参数
    如果要充分考虑到文件可能不存在,再次打开之前就需要创建,此时需要使用mode参数
    mode参数值:

    mode参数支持"或"运算,可以同时使用上表中的一个或者多个参数,可以使用"|"关键字来直接连接或者对其对应的值进行计算之后获得最后的数值进行直接调用。
  1. close函数用于关闭一个已经打开的文件,如果关闭成功,返回0,否则返回-1对close函数的标准调用格式说明:
#include<unistd.h>
int close(int fd);
  1. 当对文件进行打开和关闭操作时,还会对其相关信息产生相应的影响:
  • 当打开一个文件的时候,该文件描述中的引用计数值加1,而关闭一个文件时,该文件描述中的引用计数器值减1,当引用计数器的值减为0时,系统调用close函数不仅将释放该文件的描述符,而且也将释放该文件所占的描述表项。
  • 关闭一个文件时也释放该进程加在该文件上的所有记录锁,当一个进程终止时,所有的打开文件都由内核自动关闭。很多程序都使用这一功能而不显示的利用close关闭文件。
  • 当关闭的不是一个普通文件时,可能会产生一些其他影响,例如关闭管道文件的一端时,将影响到管道的 另一端。
  1. close的参数为文件描述符,通常来说这个符号为其他函数的返回值,例如open函数。
    例1:应用代码在当前工作目录下以读写打开方式打开一个名为"opentest"的文件,如果文件不存在,则创建文件,创建该文件时使 用S_IRWXU关键字给予该文件读写操作的权限。
//一个标准的open函数调用实例,打开文件opentest,如果没有则创建
//然后返回文件的描述符,并且关闭文件后退出
#include<stdlib.h>
#include<fcntl.h>
#include<stdio.h>
int main(){
   int fd;  //文件描述符
   int temp;
    fd=open("./opentest",O_RDWR|O_CREAT,S_IRWXU);
    printf("The Descriptor is %d\n",fd);   //输出文件描述符
    temp=close(fd);                        //关闭文件
    exit(0);
}
  1. 例2:打开和关闭指定文件的应用实例
    使用open函数在当前工作目录下打开或者创建一个文件的应用实例。
    利用main函数的argv参数来传递用户指定的文件名。
    以下为一个允许用户输入任意字符串作为打开或者创建文件名称的实例
//使用argv来传递待打开或者创建文件参数的应用程序
#include<stdlib.h>
#include<fcntl.h>
#include<stdio.h>
int main(int argc,char*argv[]){
  int fd;
    int temp;
    if(argc!=2){
    printf("error\n");
    }
    else{
    fd=open(*(argv+1),O_RDWR|O_CREAT,S_IRWXU);
        printf("The file descriptor is %d\n",fd); //输出文件描述符
        temp=close(fd);
    }
    exit(0);
}

在传递argv参数之前,应先利用argc参数来检查argv参数的数目是否正确。

相关文章
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
12月前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
597 13
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
285 26
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
310 17
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
727 13
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
1011 6
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
578 3