IO进、线程——标准文件IO和时间函数

news2025/1/11 6:58:40

1.文件IO

最直观的系统调用

1.1打开文件

int open(const char *pathname, int flags, mode_t mode);
功能:打开/创建后打开一个文件
返回值:成功返回文件描述符,失败-1

0 —— 标准输入  1 —— 标准输出   2 —— 标准出错

参数说明:
pathname:要打开的某个文件
flags:打开文件的方式
	O_RDONLY:只读
	O_WRONLY:只写
	O_RDWR:读写
	O_APPEND:在文件末尾追加
	O_CREAT:文件不存在则创建,文件存在则不管
	O_EXCL:和O_CREAT,文件不存在则会创建,文件存在则直接报错
	O_TRUNC:文件存在就清空
mode:创建文件时的权限,只有写了O_CREAT的时候才生效,如0666
	最后文件的权限会使用 mode和~umask相与
#include <fcntl.h>
#include <stdio.h>

int main() {
    // 打开文件,并以只写方式创建文件,权限设置为0644
    int fileDescriptor = open("example.txt", O_CREAT | O_WRONLY, 0644);
    if (fileDescriptor == -1) {
        perror("open");
        return 1;
    }

    // 写入内容到文件
    write(fileDescriptor, "Hello, this is a file example!\n", 30);

    // 关闭文件
    close(fileDescriptor);

    return 0;
}

1.2读文件

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
功能:从fd里读取内容存放到buf
返回值:成功返回实际读到的字节数,失败返回-1

参数说明:
fd:已经打开的文件描述符
buf:要存放的缓冲区
count:预计要读的字节数,不能超过buf的大小
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    // 打开文件,并以只读方式打开
    int fileDescriptor = open("example.txt", O_RDONLY | O_CREAT , 0644);
    if (fileDescriptor == -1) {
        perror("open");
        return 1;
    }

    // 读取文件内容到缓冲区
    char buffer[256];
    ssize_t bytesRead = read(fileDescriptor, buffer, sizeof(buffer) - 1);
    if (bytesRead == -1) {
        perror("read");
        return 1;
    }
    buffer[bytesRead] = '\0'; // Null-terminate the buffer

    printf("Read %ld bytes: %s\n", bytesRead, buffer);

    // 关闭文件
    close(fileDescriptor);

    return 0;
}

一种简单的图片加密方式

1.3写文件

ssize_t write(int fd, const void *buf, size_t count);
功能:往fd里写内容
返回值:成功返回实际写入的字节数,失败返回-1

参数说明:
fd:已经打开的文件描述符
buf:存放的要写入的内容的缓冲区
count:预计要写的字节数,不能超过buf的大小
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {

    int fd_src = open("open.c", O_RDONLY);
    if(fd_src < 0){ 
        perror("open1");
        return -1; 
    }   
    int fd_dest = open("xxx", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if(fd_dest < 0){ 
        perror("open2");
        return -1; 
    }   

    char buf[64];
    int ret;
    while(1){
        memset(buf, 0, sizeof(buf));
        ret = read(fd_src, buf, sizeof(buf));
        if(ret <= 0){ 
            perror("read");
            return -1; 
        }

        write(fd_dest, buf, ret);
    }   

    // 关闭文件
    close(fd_src);

    return 0;
}

2.时间函数

#include <time.h>

time_t time(time_t *tloc);
功能:统计现在的系统时间(从1970-1-1 00:00:00到现在所过的秒数)
返回值:成功就返回这个秒数,失败返回-1

参数说明:
tloc:用于存放这个秒数的变量地址
time_t tm;
tm = time(NULL);  <==>	time(&tm);

struct tm {
           int tm_sec;    /* Seconds (0-60) */
           int tm_min;    /* Minutes (0-59) */
           int tm_hour;   /* Hours (0-23) */
           int tm_mday;   /* Day of the month (1-31) */
           int tm_mon;    /* Month (0-11) */
           int tm_year;   /* Year - 1900 */
           int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
           int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
           int tm_isdst;  /* Daylight saving time */
};
struct tm *gmtime(const time_t *timep);
功能:将统计的秒数转换成时间结构体的形式
返回值:成功返回时间结构体的地址,失败返回NULL

参数说明:
timep:time()的返回值
struct tm *localtime(const time_t *timep);
功能:将统计的秒数转换成时间结构体的形式
返回值:成功返回时间结构体的地址,失败返回NULL

参数说明:
timep:time()的返回值
char *asctime(const struct tm *tm);
功能:把系统时间按照固定格式转换成字符串
返回值:成功返回字符串的首地址,失败返回NULL

参数说明:
tm:转换秒数后的时间结构体
char *ctime(const time_t *timep);
功能:把系统时间按照固定格式转换成字符串
返回值:成功返回字符串的首地址,失败返回NULL

参数说明:
timep:直接转换秒数到固定字符串格式
#include <stdio.h>
#include <time.h>

int main() {
    // 获取当前系统时间
    time_t currentTime;
    time(&currentTime);

    // 转换为GMT时间
    struct tm *timeInfo = gmtime(&currentTime);

    // 打印GMT时间
    printf("GMT time: %s", asctime(timeInfo));

    // 转换为本地时间
    struct tm *localTimeInfo = localtime(&currentTime);

    // 打印本地时间
    printf("Local time: %s", asctime(localTimeInfo));

    // 直接打印当前系统时间
    printf("Current time: %s", ctime(&currentTime));

    return 0;
}

在这里插入图片描述

3.文件属性

int stat(const char *pathname, struct stat *statbuf);
功能:获取文件的属性
返回值:成功返回0,失败返回-1
pathname:要查看的文件
statbuf:用于存放信息的结构体地址
struct stat {
     dev_t     st_dev;         /* ID of device containing file */
     ino_t     st_ino;         /* Inode number */
     mode_t    st_mode;        /* File type and mode */
     nlink_t   st_nlink;       /* Number of hard links */
     uid_t     st_uid;         /* User ID of owner */
     gid_t     st_gid;         /* Group ID of owner */
     dev_t     st_rdev;        /* Device ID (if special file) */
     off_t     st_size;        /* Total size, in bytes */
     blksize_t st_blksize;     /* Block size for filesystem I/O */
     blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */


     struct timespec st_atim;  /* Time of last access */
     struct timespec st_mtim;  /* Time of last modification */
     struct timespec st_ctim;  /* Time of last status change */

#define st_atime st_atim.tv_sec      /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
#include <stdio.h>
#include <sys/stat.h>

int main() {
    // 获取文件属性
    struct stat fileStat;
    if (stat("example.txt", &fileStat) == -1) {
        perror("stat");
        return 1;
    }

    // 打印文件属性
    printf("File size: %ld bytes\n", fileStat.st_size);
    printf("Owner UID: %d\n", fileStat.st_uid);
    printf("Group GID: %d\n", fileStat.st_gid);
    printf("Permissions: %o\n", fileStat.st_mode & 0777);

    return 0;
}

在这里插入图片描述

ls-a功能

#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[])
{ 
    DIR *dirp = opendir(".");
    if(dirp == NULL){
        perror("opendir:");
        return -1;
    }
    struct dirent *dp = NULL;
    while(1){
        dp = readdir(dirp);
        if(dp == NULL){
            break;
        }else if(dp->d_name[0] != '.'){
            printf("%s\t",dp->d_name);
        }
    }
    printf("\n");
        
    return 0;
} 

ls-l功能

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <libgen.h>

int main(int argc, char *argv[])
{ 
    if(argc < 2){
        printf("请输入路径%s <src>\n",argv[0]);
        return -1;
    }
    DIR* dirp = opendir(argv[1]);
    if(dirp == NULL){
        perror("opendir:");
        return -1;
    }
    struct dirent* dp = NULL;
    struct stat st;
    char pathname[1024];
    while((dp = readdir(dirp)) != NULL){
        if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) {
            continue;
        }
        sprintf(pathname, "%s/%s", argv[1], dp->d_name);
        if (lstat(pathname, &st) < 0) {
            perror("lstat:");
            break;
        }
        switch(st.st_mode & S_IFMT){
            case S_IFSOCK: printf("s");break;
            case S_IFLNK: printf("l");break;
            case S_IFREG: printf("-");break;
            case S_IFBLK: printf("b");break;
            case S_IFDIR: printf("d");break;
            case S_IFCHR: printf("c");break;
            case S_IFIFO: printf("p");break;
        }
        int n = 8;
        while(n > 0){
            if(st.st_mode & 1 << n){
                switch(n%3){
                    case 2:printf("r");break;
                    case 1:printf("w");break;
                    case 0:printf("x");break;
                }
            }else{
                printf("-");
            }
            n--;
        }
        struct passwd *u_uid = getpwuid(st.st_uid);
        printf(" %s",u_uid->pw_name);

        struct group* g_uid = getgrgid(st.st_gid);
        printf(" %s",g_uid->gr_name);

        printf(" %8ld",st.st_size);
        struct tm *time = localtime(&st.st_mtime);

        int month = time->tm_mon+1;
        switch(month)
        {
            case 1: printf(" 一月"); break;
            case 2: printf(" 二月"); break;
            case 3: printf(" 三月"); break;
            case 4: printf(" 四月"); break;
            case 5: printf(" 五月"); break;
            case 6: printf(" 六月"); break;
            case 7: printf(" 七月"); break;
            case 8: printf(" 八月"); break;
            case 9: printf(" 九月"); break;
            case 10: printf(" 十月"); break;
            case 11: printf(" 十一月"); break;
            case 12: printf(" 十二月"); break;
        }
        printf(" %2d %d:%02d  %s",time->tm_mday,time->tm_hour,time->tm_min,dp->d_name);
        printf("\n");

    }
    closedir(dirp);

    return 0;
} 

ls-l功能源文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <libgen.h>

void printPermissions(mode_t mode) {
    printf((S_ISDIR(mode)) ? "d" : "-");
    printf((mode & S_IRUSR) ? "r" : "-");
    printf((mode & S_IWUSR) ? "w" : "-");
    printf((mode & S_IXUSR) ? "x" : "-");
    printf((mode & S_IRGRP) ? "r" : "-");
    printf((mode & S_IWGRP) ? "w" : "-");
    printf((mode & S_IXGRP) ? "x" : "-");
    printf((mode & S_IROTH) ? "r" : "-");
    printf((mode & S_IWOTH) ? "w" : "-");
    printf((mode & S_IXOTH) ? "x" : "-");
}

void printFileInfo(const char *filename) {
    struct stat fileStat;

    if (stat(filename, &fileStat) < 0) {
        perror("stat");
        return;
    }

    // 打印文件权限
    printPermissions(fileStat.st_mode);
    printf(" ");

    // 打印硬链接数
    printf("%ld ", fileStat.st_nlink);

    // 打印所有者用户名
    struct passwd *pw = getpwuid(fileStat.st_uid);
    printf("%-2s ", pw->pw_name);

    // 打印所有者所属组名
    struct group *gr = getgrgid(fileStat.st_gid);
    printf("%-2s ", gr->gr_name);

    // 打印文件大小
    printf("%5ld ", fileStat.st_size);

    // 打印最后修改时间
    struct tm *timeinfo;
    char timeString[80];
    timeinfo = localtime(&fileStat.st_mtime);
    strftime(timeString, sizeof(timeString), "%Y年%m月%d日 %H:%M", timeinfo);
    printf("%s ", timeString);

    // 打印文件名
    printf("%s\n", basename((char*)filename));
}

int main() {
    char cwd[1024];

    if (getcwd(cwd, sizeof(cwd)) == NULL) {
        perror("getcwd");
        return 1;
    }

    DIR *dir = opendir(cwd);
    if (!dir) {
        perror("opendir");
        return 1;
    }

    int blocksize = 0;

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 忽略以'.'开头的文件(隐藏文件)
        if (entry->d_name[0] == '.')
            continue;

        char path[PATH_MAX];
        snprintf(path, sizeof(path), "%s/%s", cwd, entry->d_name);

        struct stat fileStat;
        if (stat(path, &fileStat) < 0) {
            perror("stat");
            continue;
        }

        blocksize += fileStat.st_blocks;
    }

    closedir(dir);

    // 打印总用量(总块数)
    printf("总用量:%d\n", blocksize / 2);

    dir = opendir(cwd);
    if (!dir) {
        perror("opendir");
        return 1;
    }

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_name[0] == '.')
            continue;

        char path[PATH_MAX];
        snprintf(path, sizeof(path), "%s/%s", cwd, entry->d_name);
        printFileInfo(path);
    }

    closedir(dir);

    return 0;
}

4.库的制作

4.1静态库

①.生成二进制文件

gcc -c linkstack.c -o linkstack.o

在这里插入图片描述

②.制作静态库文件(把.o文件转换成.a文件)

ar crs libmykun.a hello.o	//生成libmykun.a这个静态库文件

在这里插入图片描述

③.编译时链接

gcc linkstack_main.c -L. -llinkstack		//-L表示指定库路径,-l表示指定具体的库

在这里插入图片描述

4.2动态库

①.生成地址无关二进制文件

gcc -fPIC -c linkstack.c

在这里插入图片描述

②.制作动态库文件

gcc -shared -o liblinkstack.so linkstack.o

在这里插入图片描述

③.编译时链接

gcc linkstack_main.c -L. -llinkstack		//-L表示指定库路径,-l表示指定具体的库

在这里插入图片描述

注:动态库程序运行时需要去默认路径加载库
1.把动态库文件拷贝到/lib或者/usr/lib目录下

2.配置动态库搜索文件
2.1、sudo vi /etc/ld.so.conf.d/my.conf(新建一个my.conf)将你的.so文件路径复制进去进行
2.2、把动态库路径存放进文件(再次刷新)
sudo ldconfig /etc/ld.so.conf.d/my.conf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive之窗口函数lag()/lead()

一、函数介绍 lag()与lead函数是跟偏移量相关的两个分析函数 通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤&#xff0c;该操作可代替表的自联接&#xff0c;且效率更高 lag()/lead() lag(c…

VS构建项目报错信息及解决办法05

报错信息及解决8&#xff1a; 报错信息详情&#xff1a;无法解析的外部符号“__iob_func” 原因&#xff1a;因VS不同版本之间对stdin,stdout,stder的定义不同&#xff0c;导致不同VS版本之间无法正确的调用函数。 eg: * 当libjpeg-turbo为vs2010编译时&#xff0c;vs2015下…

qsort的使用及模拟实现

qsort函数是C语言库中提供的一种快速排序&#xff0c;头文件是stdlib.h qsort的使用 qsort函数需要四个参数&#xff1a; 1.排序的起始位置的地址&#xff08;数组名&#xff09;: arr 2.排序元素的个数&#xff1a; sizeof&#xff08;arr)/sizeof(arr[0]) 3.排序元素…

使用BERT分类的可解释性探索

最近尝试了使用BERT将告警信息当成一个文本去做分类&#xff0c;从分类的准召率上来看&#xff0c;还是取得了不错的效果&#xff08;非结构化数据强标签训练&#xff0c;BERT确实是一把大杀器&#xff09;。但准召率并不是唯一追求的目标&#xff0c;在安全场景下&#xff0c;…

java中线程池、Lambda表达式、file类、递归

线程池&#xff1a; 在多线程的使用过程中&#xff0c;会存在一个问题&#xff1a;如果并发的线程数量很多&#xff0c;并且每个线程都执行一个时间很短的任务就结束&#xff0c;这样频繁的创建线程就会大大降低系统的效率&#xff0c;因为线程的创建和销毁都需要时间。 线程…

maven编译报错

参考链接&#xff1a;mvn打包No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK_51CTO博客_mvn打包命令 在执行 yum install -y java-1.8.0-opensdk命令后&#xff0c;使用maven去编译打包&#xff0c;结果报错&#xff0c; …

体渲染光线行进算法【NeRF必读】

为了积分由于内散射而沿射线产生的入射光&#xff0c;我们将射线穿过的体块分解为小体块元素&#xff0c;并将每个小体块元素对整个体块对象的贡献结合起来&#xff0c;有点像我们在 2D 编辑软件&#xff08;例如 Photoshop&#xff09;中将带有遮罩或 Alpha 通道&#xff08;通…

ClickHouse(三):ClickHouse单节点搭建

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,随笔-CSDN博客 &#x1f4cc;订阅&#xff1a;拥抱…

pytorch学习——线性神经网络——1线性回归

概要&#xff1a;线性神经网络是一种最简单的神经网络模型&#xff0c;它由若干个线性变换和非线性变换组成。线性变换通常表示为矩阵乘法&#xff0c;非线性变换通常是一个逐元素的非线性函数。线性神经网络通常用于解决回归和分类问题。 一.线性回归 线性回归是一种常见的机…

WebGPU(八):三角形渲染

WebGPU(八)&#xff1a;三角形渲染 三角形的渲染其实很简单&#xff0c;只是需要设置很详细的render pipeline以及shader。 // Select which render pipeline to use wgpuRenderPassEncoderSetPipeline(renderPass, pipeline); // Draw 1 instance of a 3-vertices shape wgp…

C# 全局响应Ctrl+Alt+鼠标右键

一、简述 某些应用&#xff0c;我们希望全局自定义热键。按键少了会和别的应用程序冲突&#xff0c;按键多了可定用户操作不变。因此我计划左手用CtrlAlt&#xff0c;右手用鼠标右键呼出我自定义的菜单。 我使用键盘和鼠标事件进行简单测试&#xff08;Ctrl鼠标右键&#xff…

TypeScript -- 函数

文章目录 TypeScript -- 函数JS -- 函数的两种表现形式函数声明函数的表达式es6 箭头函数 TS -- 定义一个函数TS -- 函数声明使用接口(定义)ts 定义参数可选参数写法 -- ?的使用TS函数 -- 设置剩余参数函数重载 TypeScript – 函数 JS – 函数的两种表现形式 我们熟知js有两…

MySQLExplain详解

Explain使用场景 查询性能优化&#xff1a;EXPLAIN可以帮助开发者分析查询语句的执行计划&#xff0c;判断是否有效地使用了索引、是否有可能导致全表扫描等性能问题。通过EXPLAIN的输出&#xff0c;可以找到潜在的性能瓶颈&#xff0c;并优化查询语句、创建合适的索引或调整表…

Win11虚拟机安装并使用

windows11 虚拟机安装 操作如下&#xff1a;1.进入微软官网2.打开虚拟机应用创建新虚拟机3.选择刚下载IOS文件4 设置虚拟机磁盘空间大小&#xff0c;这个数字可以随便写&#xff0c;反正都是虚拟的&#xff0c;但不可以低于64GB。下面的是否拆分磁盘文件&#xff0c;可更具需要…

大数据课程C4——ZooKeeper结构运行机制

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Zookeeper的特点和节点信息&#xff1b; ⚪ 掌握Zookeeper的完全分布式安装 ⚪ 掌握Zookeeper的选举机制、ZAB协议、AVRO&#xff1b; 一、Zookeeper-简介 1. 特点…

【计网】什么是三次握手四次挥手

文章目录 1、什么是TCP2、什么是TCP连接2.1、连接概念2.2、如何唯一确定一个TCP连接2.3、TCP最大连接数 3、三次握手3.1、为什么需要三次握手3.2、三次握手过程3.3、为什么一定是三次3.3.1、避免历史连接3.3.2、同步双方初始序列号3.3.3、避免资源浪费3.3.4、总结 3.4、握手丢失…

vue实现卡牌数字动态翻牌效果

vue实现卡牌数字动态翻牌效果 1. 实现效果2. 实现代码 1. 实现效果 在大屏项目中&#xff0c;我们尝尝会遇到卡牌式数字显示且能动态翻牌的效果&#xff0c;效果图如下&#xff1a; 2. 实现代码 <template><div class"days-box"><div class"op…

初探PID—速度闭环控制

由于在调PID时意外把板子烧了&#xff0c;目前只完成了比例调节的调试&#xff0c;整个程序也不太完善&#xff0c;本文当前仅作记录&#xff0c;后续会完善更改。 ——2023.07.26 文章目录 一、什么是PID二、PID有什么用三、PID程序实现 一、什么是PID PID是常用的一种控制算…

windows默认编码格式修改

1.命令提示符界面输入 chcp 936 对应 GBK 65001 对应 UTF-8 2.临时更改编码格式 chcp 936(或65001) 3.永久更改编码格式 依次开控制面板->时钟和区域->区域->管理->更改系统区域设置&#xff0c;然后按下图所示&#xff0c;勾选使用UTF-8语言支持。然后重启电脑。此…

上门小程序开发|上门服务小程序|上门家政小程序开发

随着移动互联网的普及和发展&#xff0c;上门服务成为了许多人生活中的一部分。上门小程序是一种基于小程序平台的应用程序&#xff0c;它提供了上门服务的在线平台&#xff0c;为用户提供了便捷的上门服务体验。下面将介绍一些适合开发上门小程序的商家。   家政服务商家&am…