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

写文件与错误处理

写文件与错误处理一、背景上一篇总结探究了who的实现过程。学会了使用联机帮助来为自己披荆斩棘、解决问题。who命令从utmp结构中读出数据并且通过标准输出方式输出。而并未往文件中写数据。这一篇总结将会

写文件与错误处理

一、背景

上一篇总结探究了who的实现过程。学会了使用联机帮助来为自己披荆斩棘、解决问题。who命令从utmp结构中读出数据并且通过标准输出方式输出。而并未往文件中写数据。这一篇总结将会讨论之。另外将讨论linux系统调用的错误处理方式。

二、写文件

1.查找写文件的系统调用

写文件的系统调用当然可以直接从书中查找到是write。但运用联机帮助的知识也很容易的查找到。首先要联想到写文件相关联的一定是读文件系统调用readread现在已经熟悉了。那么在SEE ALSO中就可以看到写文件为write

接下来当然是用帮助文档查看下write的使用方法。

头文件与使用方法皆在其中。

2.编写cp命令

cp命令是复制粘贴命令,它会在你指定的位置创建一个新的文件并将你指定的旧文件的内容写入到新文件中。明白原理后就应该知道这里需要这几个系统调用:打开旧文件、创建新文件、读旧文件到缓冲区、写缓冲区的数据至新文件、将两个文件都关闭。这里除了创建新文件现在还不知道使用哪个系统调用外,其它的系统调用都已经使用过了。

不过这里用联机帮助我也没在SEE ALSO中找得到新建文件的系统调用。在书上查找到使用creat并使用联机帮助查询其头文件与使用方法。

在这里我发现它的使用方法与open的使用方法极为相似。而且SYNOPSIS(概览)都是一样的。只怪自己大意,其实在open中就应该想到creat是创建新的文件系统调用了。

cp命令的实现代码如下:

#include

#include

#include

#include

 

#define LEN 10000

#define MODE 0644

 

void error(char *,char *);

 

int main(int argc,char *argv[])

{

        int in_fd,out_fd,number;

        char buffer[LEN];

        if(argc!=3)

         { fprintf(stderr,"usage like this: %s source destination.\n",argv[0]);

        exit(1);

        }

        if((in_fd=open(argv[1],O_RDONLY))==-1)

          error("Cannot open the sourcefile.\n",argv[1]);

        if((out_fd=creat(argv[2],MODE))==-1)

          error("Cannot open the destinationfile.\n",argv[2]);

        while((number=read(in_fd,buffer,LEN))>0)

          if(write(out_fd,buffer,number)!=number)

          error("failed to write to the destination.\n",argv[2]);

        if(number==-1)

        error("failed to read from the sourcefile.\n",argv[1]);

        if((close(in_fd)==-1) || (close(out_fd))==-1)

        error("failed to close the file","");

        return 0;

}

 

void error(char *a,char *b)

{

        fprintf(stderr,"error:%s",a);

        perror(b);

exit(1);

}

 

这个程序的实现其实相对于who会简单一点。主要是需要处理好错误处理。错误处理后面会分析到。

 

二、处理系统调用中的错误

1.错误的出现

系统调用中可能会出现许多种类型的错误,比如open:当打开一个文件你却没权限时会报错,如果已经打开很多文件内存不足也会报错,如果你打开的这个文件根本就不存在,当然也会报错。总之错误方式多多。而无论是opencreat还是readwriteclose,报错都是会返回一个值:-1的。

2.确定错误种类

种类繁多的错误,都只是返回-1,可若要进行某种修正,那么编程者知道到底是何种错误就显得尤其重要了。确定错误种类的命令errno,查看其联机帮助可以看到各种错误代码的说明,多得数不胜数。我随便截了一部分。

也就是说,当errno==(某个错误代码)时,就应该是某种错误类型,在标准输出就应该输出其对应的说明了。程序示例如下:

#include

extern int errno;

int sample()

{

        int fd;

        fd=open("file",O_RDONLY);

        if(fd==-1)

        {

        printf("Cannot open file:");

        if(errno==ENOENT)

        printf("There is no such file.\n");

        if(errno==EINTR)

        printf("Interrupted while opening file.\n");

        if(errno==EACCESS)

        printf("You do not have permission to open file.\n");

        ...

这段程序是不完整的程序,就是为了说明每一种错误类型均对应某一种应标准输出的错误说明。

3.perror

这个命令是一种更为方便省心的错误处理方式。之前我的程序代码中就多次出现了。将前面的sample程序修改一下:            

    int sample()

{

        int fd;

        fd=open("file",O_RDONLY);

        if(fd==-1)

        {

        perror("cannot open this file");

        exit(1);

        ...

由此可以看出这种错误输出方式确实简单方便的多。所以非常常用。

这里看一个实例,刚才编写的cp命令来错误的使用:

我用自己编写的cp来复制1233.c,可以看到其报错信息如前所述。

 

三、总结

    写文件沿袭了上一次的总结,只是新学习了两个系统调用:creatwrite。而处理调用中的错误就是学会使用perror命令。errno运作方式了解即可。



推荐阅读
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
author-avatar
qixian0392_648
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有