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

1.文件IO

最直观的系统调用

1.1打开文件

int open(const char *pathname, int flags, mode_t mode);
功能:打开/创建后打开一个文件
返回值:成功返回文件描述符,失败-10 —— 标准输入  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() {// 打开文件,并以只写方式创建文件,权限设置为0644int 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 bufferprintf("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.mzph.cn/news/9124.shtml

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

相关文章

linux操作历史history定制

history记录 Linux中历史操作记录history是一个很有用的功能&#xff0c;有时忘记了&#xff0c;翻翻以前的命令&#xff0c;十分方便。 # 展示所有历史记录 history # 筛选历史记录 history | grep nginx # 清除全部记录 -c history -c # 指定删除某一行,15是行号 history -…

ACwing 1081. 度的数量

文章目录 题意思路代码 题意 给你一段区间[x, y]求其中满足一个数恰好等于K个互不相等的B的整数次幂之和的数的个数。 例如&#xff1a;x 15, y 20, k 2, b 2&#xff0c;那么对于这个区间有且仅有三个数满足题意&#xff1a; 17 2 4 2 0 10001 17 2^42^0 10001 1724…

linux | vscode | makefile | c++编译和调试

简单介绍环境&#xff1a; vscode 、centos、 gcc、g、makefile 简单来说就是&#xff0c;写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程&#xff0c;以及官网也看了很多次&#xff0c;最…

前端开发实习总结参考范文

▼前端开发实习总结篇四 读了三年的大学&#xff0c;然而大多数人对本专业的认识还是不那么透彻&#xff0c;学的东西真正能够学以致用的东西很少&#xff0c;大家都抱怨没有实践的机会&#xff0c;在很多同学心里面对于本专业还是很茫然。直到即将毕业的时候才知道我们以前学…

uni-app中的uni.requireNativePlugin()

这个方法是用来引入原生插件的方法&#xff0c;自 HBuilderX 1.4 版本起&#xff0c;uni-app 支持引入原生插件&#xff0c;使用方式如下&#xff1a; const PluginName uni.requireNativePlugin(PluginName); // PluginName 为原生插件名称 引入插件的类型有三种&#xff1…

东南大学齿轮箱故障诊断(Python代码,CNN结合LSTM模型)

运行代码要求&#xff1a; 代码运行环境要求&#xff1a;Keras版本>2.4.0&#xff0c;python版本>3.6.0 1.东南大学采集数据平台&#xff1a; 数据 该数据集包含2个子数据集&#xff0c;包括轴承数据和齿轮数据&#xff0c;这两个子数据集都是在传动系动力学模拟器&am…

【计算机网络】计算机网络基础知识总结(秋招篇)

文章目录 前言计算机网络笔记TCP和UDP分别是什么 有什么区别基于TCP UDP这两个协议的上层协议有哪些&#xff1f;TCP和UDP分别在哪些领域被用的多&#xff1f;TCP实现可靠性传输用了哪些技术&#xff1f;&#xff08;TCP如何实现可靠性传输&#xff09;讲一下超时重传和超时定时…

全志F1C200S嵌入式驱动开发(触摸屏驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 触摸屏一般有两种,一种是电阻触摸屏,一种是电容触摸屏。前者需要自己买一颗i2c的信号读取芯片,用的比较多的是ns2009。后者自身集成了读取芯片,用的比较多的是gt911。正好之前测…

C# Modbus TCP上位机测试

前面说了三菱和西门子PLC的上位机通信&#xff0c;实际在生产应用中&#xff0c;设备会有很多不同的厂家生产的PLC&#xff0c;那么&#xff0c;我们就需要一种通用的语言&#xff0c;进行设备之间的通信&#xff0c;工业上较为广泛使用的语言之一就是Modbus。 Modbus有多种连…

Pytorch从入门到精通:二、dataset与datalodar

数据是深度学习的基础&#xff0c;一般来说&#xff0c;数据量越大&#xff0c;训练出来的模型也越强大。如果现在有了一些数据&#xff0c;该怎么把这些数据加到模型中呢&#xff1f;Pytorch中提供了dataset和dataloader&#xff0c;让我们一起来学习一下吧&#xff0c;datase…

5-linux中的定时任务调度

定时任务调度 crond 任务调度概述基本语法常用选项快速入门应用实例crond 相关指令 at 定时任务基本介绍at 命令格式at 命令选项at 时间的定义其他指令 crond 任务调度 crontab 进行 定时任务调度 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务…

360T7路由器进行WiFi无线中继教程

360T7路由器进行WiFi中继教程 1. 概述2. 360T7路由器进行WiFi中继实现教程2.1 登录路由器管理界面2.2 选择上网方式2.3 搜索WiFi2.4 连接WiFi2.5 点击确认2.6 在主页面查看网络 1. 概述 中继路由系统由一组中继路由器组成&#xff0c;为不能交换路由信息的路由域提供中继路由。…

Docker consul的容器服务更新与发现

&#xff08;1&#xff09;什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&am…

centos 8安装A10显卡驱动-AI人工智能

centos 8安装A10显卡驱动命令:./NVIDIA-Linux-x86_64-535.54.03.run --kernel-source-path/usr/src/kernels/4.18.0-147.el8.x86_64 安装完毕; 测试: 检查驱动版本号: nvidia-smi 验证驱动模块已加载: lsmod | grep nvidia

【腾讯云 Cloud Studio 实战训练营】沉浸式体验编写一个博客系统

文章目录 前言新建工作空间登录(注册)Cloud Studio 账号&#xff1a;进入 Cloud Studio 控制台&#xff1a;配置工作空间参数&#xff1a;确认并创建工作空间&#xff1a;项目搭建 配置nuxt 脚手架运行项目报错信息解决错误脚手架运行预览问题 开启博客代码配置layout首页配置 …

JVM理论(六)执行引擎--垃圾回收

概述 垃圾: 指的是在运行程序中没有任何指针指向的对象垃圾回收目的: 为了及时清理空间使得程序可以正常运行垃圾回收机制: JVM采取的是自动内存管理,即JVM负责对象的创建以及回收,将程序员从繁重的内存管理释放出来,更加专注业务的开发垃圾回收区域: 频繁收集Young区(新生代)…

配置IPv4 over IPv6隧道示例

IPv4 over IPv6隧道&#xff1a; 在IPv4 Internet向IPv6 Internet过渡后期&#xff0c;IPv6网络被大量部署后&#xff0c;而IPv4网络只是散布在世界各地的一些孤岛。利用隧道技术可以在IPv6网络上创建隧道&#xff0c;从而实现IPv4孤岛的互联&#xff0c;IPv4孤岛能通过IPv6公…

MFC CList 类的使用

MFC提供CList 类&#xff1b; 类CList支持可按顺序或按值访问的非唯一对象的有序列表&#xff1b;CList 列表与双链接列表行为相似&#xff1b; 类型POSITION的变量是列表的关键字&#xff1b;可使用POSITION变量作为循环因子来顺序遍历列表&#xff0c;作为书签来保存位置&am…

自动驾驶数据标注有哪些?

自动驾驶汽车&#xff1a;人工智能(AI)的焦点 人工智能驱动汽车解决方案的市场规模预计到 2025年将增长十倍以上&#xff0c;提升车内体验的商机领域以及 AI 模型的无偏见训练数据的重要性。在本篇中&#xff0c;我们将介绍车外体验的关键组成部分&#xff0c;以及自动驾驶数据…

01背包相关题

题解&#xff1a;dp[j]表示目标和为j时的最大组合种数 class Solution { public:int dp[1005];int findTargetSumWays(vector<int>& nums, int target) {int val;int sum0;for(int i0;i<nums.size();i){sumnums[i];}int wsumtarget;if(w%21){return 0;}else{valw…