时间函数,文件操作函数,Makefile

今天主要也是对昨天学习的进行了补充

一,时间函数

1.time函数

函数原型:time_t time(time_t *tloc);
功能:获取当前时间(自1970年1月1日(称为Unix纪元或Epoch)以来的秒数,即Unix时间戳)。
参数:如果tloc不是NULL,则该函数还会将时间戳存储在tloc指向的位置。
返回值:返回当前的时间戳。如果发生错误,则返回(time_t)(-1)。

输出结果值为1900.1.1 0:00到今天的秒数

2.c time:将秒数转化成人看的

3.localtime

函数原型:

struct tm *localtime(const time_t *timer);


功能:将时间戳(time_t类型)转换为本地时间(考虑时区),并返回一个指向struct tm结构的指针。struct tm包含了分解后的时间信息,如年、月、日、小时、分钟、秒等。
参数:timer指向一个包含时间戳的time_t对象。
返回值:返回一个指向struct tm的指针,该结构包含了转换后的本地时间信息。如果发生错误,则返回NULL(但在实际使用中,这种情况很少见)。

年要加1900 月要加1

Localtime的宏

二,文件操作函数

1.symlink:软连接(快捷方式)  //ln 

一,函数原型

#include <unistd.h>

int symlink(const char *oldpath, const char *newpath);


其中,oldpath 参数是目标文件或目录的路径,而 newpath 参数是要创建的符号链接的路径。如果函数成功执行,它将返回0;如果失败,则返回-1,并设置相应的 errno 来指示错误原因。

二、函数功能

symlink函数的主要功能是创建一个新的符号链接,该链接指向由 oldpath 指定的文件或目录。这意味着,当通过 newpath 访问该链接时,实际上访问的是 oldpath 指定的文件或目录。

三、使用场景

symlink函数在多种场景下都非常有用,包括但不限于:

文件共享:通过创建符号链接,可以在不同位置共享同一个文件或目录,而无需复制它们。这可以节省磁盘空间,并简化文件管理。
简化路径:如果某个文件或目录的路径很长或很复杂,可以通过创建一个指向它的符号链接来简化访问路径。
版本控制:在软件开发中,可以使用符号链接来指向不同版本的库文件或配置文件,以便在测试和开发过程中轻松切换。
环境配置:在系统配置中,可以使用符号链接来指向特定的配置文件或程序,以便在不修改原始文件的情况下进行自定义设置。

四、注意事项

在使用symlink函数时,需要注意以下几点:

目标文件或目录必须存在:在创建符号链接之前,必须确保目标文件或目录已经存在。否则,symlink函数将失败。
链接文件或目录不能与已有文件或目录同名:如果 newpath 指定的路径已经存在与文件名或目录名相同的文件或目录,那么symlink函数将失败。这是因为文件系统不允许在同一位置创建两个同名的文件或目录(尽管符号链接本身不是文件或目录的副本)。
权限问题:创建符号链接的用户必须具有在 newpath 指定的目录中创建文件的权限。否则,symlink函数将失败。
跨文件系统:符号链接可以跨文件系统工作,即 oldpath 和 newpath 可以位于不同的文件系统上。但是,需要注意的是,如果目标文件或目录被移动或删除,符号链接将变得无效(即所谓的“断链”)。

2.remove      //rm

int remove(const char *filename);

filename:指向要删除的文件名的指针。

返回值:

如果文件成功被删除,remove函数返回0。
如果删除失败(例如,因为文件不存在或没有足够的权限),则返回-1,并设置全局变量errno以指示具体的错误原因。

使用remove函数时需要注意以下几点:

权限:调用remove函数的程序必须具有删除指定文件的权限。
目录:remove函数通常用于删除文件,而不是目录。尝试删除目录的行为是未定义的,并且大多数实现都会失败。
链接数:在Unix-like系统中,如果文件有多个硬链接,remove函数只会删除一个链接,并减少文件的链接数。当链接数减至0时,文件内容才会被真正删除。
错误处理:检查remove函数的返回值以确定操作是否成功,并可能通过errno变量来获取更详细的错误信息。

3.rename   //mv

函数原型如下:

int rename(const char *oldname, const char *newname);

oldname:指向要重命名的文件或目录的旧名称的指针。
newname:指向新名称的指针。

返回值:

如果重命名成功,rename函数返回0。
如果失败,则返回-1,并设置全局变量errno以指示具体的错误原因。

使用rename函数时需要注意以下几点:

权限:调用rename函数的程序必须具有对旧文件或目录的写权限,以及对新名称所在目录的写权限和搜索权限。
跨文件系统:在某些系统上,如果oldname和newname位于不同的文件系统上,rename操作可能会失败。这是因为文件系统之间的重命名通常不被支持,而需要复制和删除操作来模拟。
目录:rename函数同样适用于目录。但是,当重命名目录时,需要确保新名称在当前目录下是唯一的,并且不会与现有的文件或目录冲突。
原子性:在大多数实现中,rename操作是原子的,这意味着在重命名操作期间,文件或目录将不可见(即,它不会以旧名称或新名称存在),直到操作完成。

4.link 硬链接

函数原型:
#include <unistd.h>
int link(const char *oldpath, const char *newpath);

参数:

oldpath:指向已存在文件的路径。
newpath:指向要创建的新硬链接的路径。

返回值:

成功时,返回0。
失败时,返回-1,并设置全局变量errno以指示错误原因。

注意:

如果newpath已经存在,则link调用会失败,除非newpath也是一个对oldpath的硬链接。
硬链接不能跨文件系统创建。
删除硬链接中的一个不会影响文件内容,只有当最后一个硬链接被删除时,文件内容才会被删除
字符串处理中的link函数(误解)

在C语言中,对于字符串处理,并没有直接名为link的标准函数。如果你看到或听到关于link函数用于字符串处理的描述,这很可能是一个误解或特定上下文中的自定义函数。

例如,在某些情况下,可能会编写一个自定义的link函数,用于将两个字符串数组合并到一个新的字符串数组中,但这并不是C语言标准库的一部分。

5.truncate 改变文件大小

一、函数原型

#include <unistd.h>
int truncate(const char *path, off_t length);

二、参数说明


path:指向需要进行大小调整的文件的路径的指针。
length:指定的新文件大小,以字节为单位

三、函数功能


如果指定的length小于文件原始大小,则会截断文件,将文件大小调整为length指定的长度,超出部分的数据将被删除。
如果指定的length大于文件原始大小,则文件的大小将被增加,增加的部分将会用零(NUL)字节填充。


四、返回值


成功执行时,返回0。
失败时,返回-1,并设置全局变量errno以指示具体的错误原因。

五、常见错误代码

EACCES:无权访问文件。
EROFS:尝试修改只读文件系统的文件。
EFAULT:path指针超出内存范围。
EINVAL:path包含非法字符或文件名过长。
ENOTDIR:路径不是目录。
EISDIR:path指向一个目录。
ETXTBUSY:文件是正在执行的共享程序。
ELOOP:路径中有过多的符号链接。
EIO:I/O存取错误。

六、使用场景

truncate函数通常用于需要直接通过文件路径操作文件大小的情况。它不需要打开文件即可修改文件大小,这在某些场景下可以提高效率。

七、注意事项

使用truncate函数需要适当的权限,以便对文件进行写操作。
truncate函数只能用于普通文件,而不能用于目录或特殊文件。
在修改文件大小之前,请确保有足够的磁盘空间来存储新增加的数据(如果length大于文件原始大小)。

三,报错函数

1.perror函数

函数原型

#include <stdio.h>
#include <string.h>

void perror(const char *s);

参数
s:一个指向以 null 结尾的字符串的指针,该字符串将被打印在错误信息之前。如果 s 是 NULL,则不打印任何前缀字符串。
功能
perror 函数首先打印出传递给它的字符串 s(如果 s 不是 NULL),然后打印一个冒号(:)、一个空格和对应于 errno 当前值的错误描述字符串。
错误描述字符串是由 C 运行时库提供的,它根据 errno 的值来查找并返回相应的错误描述。
perror 函数通常用于调试目的,帮助开发者理解系统调用失败的原因。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main() {
    FILE *fp = fopen("/nonexistent/file.txt", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }
    // 如果文件成功打开,则进行后续操作...
    // 这里只是示例,所以文件打开会失败

    return 0;
}

在这个示例中,尝试打开一个不存在的文件。由于文件不存在,fopen 函数会失败,并将 errno 设置为一个表示错误的值(如 ENOENT,表示“没有那个文件或目录”)。然后,perror 函数被调用,打印出“Failed to open file: No such file or directory”(或类似的错误消息,具体取决于系统和 C 运行时库的实现)。最后,程序通过 exit(EXIT_FAILURE) 退出,表示发生了错误。

2.strerror函数

函数原型
#include <string.h>

char *strerror(int errnum);

参数
errnum:一个整数,表示错误码。这通常是全局变量 errno 的值,该变量在程序运行时由系统调用和库函数设置,以指示发生的错误。
返回值
返回一个指向以 null 结尾的字符串的指针,该字符串包含了与 errnum 对应的错误描述。

返回值
返回一个指向以 null 结尾的字符串的指针,该字符串包含了与 errnum 对应的错误描述。
注意事项
线程安全性:标准的 strerror 函数可能不是线程安全的,因为它返回一个指向静态缓冲区的指针。在多线程程序中,如果多个线程同时调用 strerror 并期望获取不同的错误消息,那么它们可能会得到相同的错误消息(因为后续调用可能会覆盖之前调用的结果)。为了解决这个问题,一些系统提供了 strerror_r(POSIX.1-2001标准)或 strerror_s(C11标准)等线程安全的替代函数。
错误码合法性:传递给 strerror 的错误码必须是合法的。传递非法的错误码可能会导致未定义行为。通常,错误码是从 <errno.h> 头文件中定义的宏,如 EINVAL、ENOMEM 等。
返回值处理:strerror 返回的字符串可能是只读的,并且不应该被修改。此外,由于它是静态分配的,所以在下一次调用 strerror 或其他可能修改该静态缓冲区的函数时,其内容可能会被覆盖。

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));
    }
    return 0;
}

在这个示例中,尝试打开一个不存在的文件会导致 fopen 函数失败,并将 errno 设置为一个表示错误的值(如 ENOENT)。然后,strerror 函数被用来将 errno 的值转换为描述性的错误消息,并通过 printf 函数打印出来。

3.error函数  出现错误 需要看细节

#include <stdio.h>
#include <error.h>
#include <errno.h>
// errno 
int main(int argc, char *argv[])
{
    
    FILE* fp = fopen("12312","r");
    if(NULL == fp)
    {
        error(1,errno,"fopen,filename:%s func:%s linenum:%d",__FILE__,__func__
              ,__LINE__);
        printf("aaa\n");
        return 1;
    }


    return 0;
}

四,Makefile

在Linux系统中,Makefile是一个非常重要的文件,它用于自动化编译和构建程序。Makefile定义了如何编译和链接程序中的源文件,以及如何生成可执行文件或库文件。通过使用Makefile,开发者可以简化编译过程,特别是在处理包含多个源文件的大型项目时。

Makefile的基本结构

makefile
复制
目标: 依赖...
    命令
    ...

Makefile由一系列的“规则”组成,每个规则定义了如何生成一个或多个目标文件(通常是可执行文件或对象文件)。规则的基本格式如下目标:通常是想要生成的文件名,如可执行文件或对象文件。
依赖:生成目标所依赖的文件列表。如果依赖文件比目标文件新,或者目标文件不存在,则执行下面的命令来生成目标。
命令:用于生成目标的shell命令。每个命令前必须有一个制表符(Tab),而不是空格。

主函数

被调函数1

头文件

Makefile1

Makefile2

Makefile3.


# 定义编译器
CC=gcc

# 定义目标文件 

SRC+=add.c mul.c pow.c
 

# 定义最终的可执行文件
OBJ=a.out

# 默认目标
all:

# 链接目标文件生成可执行文件
$(OBJ): $(SRC)
    gcc $(SRC) -o $(SRC)

# 清理编译生成的文件
clean:
    rm -f $(OBJ) 


 

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值