0801|IO进程线程day4(文件IO函数)

news2024/9/23 9:32:58

作业1:从终端获取一个文件的路径以及名字

  1. 若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹
  2. 若该文件不是目录文件,则显示该文件的属性到终端上,类似ls -l这单个文件

以下代码只能跑本目录下的:

#include <stdio.h>
#include <head.h>
#include <sys/types.h>
#include <errno.h>
#include <dirent.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
void get_filePermission(mode_t m)
{
	char buf[]="rwx";
	for(int i=0;i<9;i++)
	{
		if( (m & (0400)>>i) == 0)
		{
			putchar('-');
			continue;
		}
		printf("%c",buf[i%3]);
	}
	putchar(' ');
}
void get_fileType(mode_t m)
{
	if(S_ISREG(m))
		putchar('-');
	else if(S_ISDIR(m))
		putchar('d');
	else if(S_ISCHR(m))
		putchar('c');
	else if(S_ISBLK(m))
		putchar('b');
	else if(S_ISFIFO(m))
		putchar('p');
	else if(S_ISLNK(m))
		putchar('l');
	else if(S_ISSOCK(m))
		putchar('s');
}

int File_properties(char *file_name)
{
	struct stat buf;
	if(stat(file_name,&buf) < 0 )
	{
		ERR_MSG("stat");
		return -1;
	}
	//文件的类型和权限
	get_fileType(buf.st_mode);
	get_filePermission(buf.st_mode);
	//文件的所属用户
	struct passwd* pwd=getpwuid(buf.st_uid);
	if(NULL == pwd)
	{
		ERR_MSG("getpwuid");
		return -1;
	}
	//文件所属组用户
	struct group* grp=getgrgid(buf.st_gid);
	if(NULL == grp)
	{
		ERR_MSG("getgrgid");
		return -1;
	}
	//时间
	struct tm* info=NULL;
	info=localtime(&buf.st_mtime);

	printf("%ld %s %s %ld %d月 %d %02d:%02d %s\n", buf.st_nlink, pwd->pw_name, grp->gr_name, buf.st_size,  info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, file_name);
	return 0;
}

int main(int argc, const char *argv[])
{
	//从终端获取一个文件的路径及名字
	//若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹
	//若该文件不是目录文件,则显示该文件的属性到终端上,类似ls -l这单个文件

	//输入文件路径及名字
	char file_name[50]="";
	printf("请输入一个文件的路径以及名字:");
	scanf("%s",file_name);
	struct stat buf;
	//打开这个文件
	if( stat(file_name, &buf) < 0)
	{
		ERR_MSG("stat");
		return -1;
	}
	printf("打开成功\n");
	//判断这个是不是目录文件
	if( (buf.st_mode & S_IFMT) == S_IFDIR )
	{
		DIR* dp=opendir(file_name);
		if(NULL == dp)
		{
			ERR_MSG("opendir");
			return -1;
		}
		printf("opendir success\n");
		int i=0;
		while(1)
		{
			struct dirent* rp= readdir(dp);
			if(NULL == rp)
			{
				if(0 == errno)
				{
					printf("目录读取完毕\n");
					break;
				}
				else
				{
					ERR_MSG("readdir");
					return -1;
				}
			}
			if(rp->d_name[0] != '.')
			{
				//printf("[%d]%s\n", ++i, rp->d_name);
				File_properties(rp->d_name);
			}
		}
		if( closedir(dp) < 0)
		{
			ERR_MSG("closedir");
			return -1;
		}
	}
	else
	{
		//不是目录文件
		File_properties(file_name);
	}
	return 0;
}

作业2:文件IO函数实现,拷贝文件

子进程先拷贝后半部分,父进程再拷贝前半部分。允许使用sleep函数

#include <stdio.h>
#include <head.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
	//文件IO函数实现,拷贝文件
	//子进程先拷贝后半部分,父进程再拷贝前半部分。允许使用sleep函数
	umask(0);//将本程序的umake的值改为0
	int fd = open("./01_fork.c", O_RDONLY);
	if(fd <0)
	{
		ERR_MSG("open");
		return -1;
	}
	printf("open fd success\n");

	off_t size = lseek(fd, 0, SEEK_END);
    printf("size=%ld\n",size);
	printf("__%d__\n",__LINE__);
	//创建一个子进程
	pid_t cpid =fork();
	//在fork以下的这段代码,父子进程均运行
	
	if(cpid > 0)//在父进程中,该条件为真
	{
		sleep(1);
		lseek(fd,size/2,SEEK_SET);
		char b=0;
		for(int i=size/2;i<size;i++)
		{
			if(0== read(fd,&b,1))
				break;
			printf("%c",b);
		}
	}

	else if(0 == cpid)//在子进程中,该条件为真
	{
		lseek(fd,0,SEEK_SET);
		char b=0;
		for(int i=0;i<size/2;i++)
		{
			if(0 == read(fd,&b,1))
				break;
			printf("%c",b);
		}
	}

	//关闭文件
	if(close(fd) < 0)
	{
		ERR_MSG("close");
		return -1;
	}
	//printf("关闭成功\n");

	return 0;
}

 

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

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

相关文章

IDEA中修改类头的文档注释信息

IDEA中修改类头的文档注释信息 选择File--Settings--Editor--File and Code Templates--Includes&#xff0c;可以把文档注释写成这种的 /**author: Arbicoralcreate: ${YEAR}-${MONTH}-${DAY} ${TIME}Description: */这样回看就可以很清楚的看到自己创建脚本的时间&#xff…

Vue2 第十三节 使用Vue脚手架(一)

1.初始化脚手架 2.分析脚手架结构 3.修改默认配置 一.初始化脚手架 1.Vue脚手架式Vue官方提供的标准化开发工具 2.具体步骤 ① 如果下载缓慢&#xff0c;需要配置npm淘宝镜像 npm config set registry http://registry.npm.taobao.org ② 全局安装: npm install -g vu…

Jenkins配置流水线

一、新建任务 这个任务名称将会是Jenkins的workspace路径下的一个目录&#xff0c;如我建立了一个test任务&#xff0c;那么Jenkins会生成一个/jenkins_home/workspace/test目录&#xff0c;用来拉取代码编译等。所以请谨慎设置任务名称。

直线模组如何进行精度校准?

直线模组是一种高精度的传动元件&#xff0c;而精度是直线模组的重要指标&#xff0c;在直线模组的使用中&#xff0c;我们应该尽可能的避免直线模组的精度受损&#xff0c;这样才能够有真正的发挥出直线模组的稳定性。 直线模组的精度一般是指重复定位精度和导向精度&#xff…

puppeteer监听response并封装为express服务调用

const express require(express); const puppeteer require(puppeteer); const app express(); let browser; // 声明一个全局变量来存储浏览器实例app.get(/getInfo, async (req, res) > {try {const page_param req.query.page; // 获取名为"page"的查询参数…

汉王人脸考勤管理系统SQL注入RCE

忘掉&#xff01;忘掉温暖&#xff0c;忘掉温柔&#xff0c;忘掉一切享乐&#xff0c;而把饥饿、寒冷、受辱、受苦当做自己的正常生活 漏洞描述 汉王人脸考勤管理系统存在SQL注入漏洞&#xff0c;攻击者可利用该漏洞获取数据库敏感信息并Getshell。 漏洞复现 访问漏洞url&a…

MySQL多版本并发控制

1. 什么是MVCC MVCC(Multiversion Concyrrency Contril)&#xff0c;多版本并发控制。顾名思义&#xff0c;MVCC是通过数据行的多个版本来管理实现数据库的 并发控制。这项技术使得在innodb的事务隔离级别下执行 一致性读 操作有了保证。换言之&#xff0c;就是为了查询一些正在…

2023.7月最新ORACLE考试通过|微思-ORACLE官方授权中心

微思-ORACLE官方授权培训中心 2022 ORACLE OCP考试战报https://blog.csdn.net/XMWS_IT/article/details/125866726?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169089281916800182194373%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&r…

Linux系统编程 - 基础IO(IO操作)

目录 预备知识 复习C文件IO相关操作 printf相关函数 fprintf snprintf 读取文件 系统文件IO操作 open函数 umask()函数 open函数返回值 预备知识 1.你真的理解文件原理和操作了吗&#xff1f; 不是语言问题&#xff0c;是系统问题 2.是不是只有C/C有文件操作呢&…

IP地址转换函数

#include<string.h> #include<arpa/inet.h> #include<stdio.h>int main(void){char ip[]"1.2.3.4";//字符串struct sockaddr_in server_addr;inet_pton(AF_INET,ip,&server_addr.sin_addr.s_addr);//字符串 to 网络字节序printf("s_addr …

AI情绪鼓励师(基于PALM 2.0 finetune)

AI情绪鼓励师&#xff08;基于PALM 2.0 finetune) 目录 一、写在前面的话 二、前言 三、获取用于finetune的“夸夸”数据集 四、 获取并finetune PALM 2.0 预训练生成模型 模型 五、模型调用应用 一、写在前面的话 从小我就是极端内向和社恐的孩子&#xff0c;我普通之极…

面试总结-Redis篇章(十)——Redis哨兵模式、集群脑裂

Redis哨兵模式、集群脑裂 哨兵模式哨兵的作用服务状态监控 Redis集群&#xff08;哨兵模式&#xff09;脑裂解决办法 哨兵模式 为了保证Redis的高可用&#xff0c;Redis提供了哨兵模式 哨兵的作用 服务状态监控 Redis集群&#xff08;哨兵模式&#xff09;脑裂 假设由于网络原…

Java对象克隆

1.为什么要对象克隆&#xff1f; 因为直接new创建的对象&#xff0c;对象中的属性都是初始化的值&#xff0c;如果要使创建出来的对象要保存当前对象的状态&#xff0c;就要使用克隆了。 2.浅克隆 在浅克隆中&#xff0c;如果原型对象中的属性包含有引用变量&#xff0c;则将…

JSON语法

目录 一、JSON 语法规则 二、JSON 的两种结构&#xff1a; 三、JSON 名称/值对 JSON 值 JSON 数字 JSON 对象 JSON 数组 JSON 布尔值 JSON null 四、JSON 使用 JavaScript 语法 JSON 语法是 JavaScript 语法的子集。 一、JSON 语法规则 JSON 语法是 JavaScript 对象…

Java时间日期API

文章目录 java.lang.System类的方法本地日期时间&#xff1a;LocalDate、LocalTime、LocalDateTime瞬时&#xff1a;Instant日期时间格式化&#xff1a;DateTimeFormatter计算相差日期/时间&#xff1a;Period和Durationjava.util.Date(不推荐)java.text.SimpleDateFormat(不推…

设置git可以同时推送gitee和github

查看当前的远程仓库设置&#xff1a; git remote -v 这会列出你当前配置的远程仓库。你可能会看到类似以下的输出&#xff1a;origin-gitee <gitee仓库地址> (fetch)origin-gitee <gitee仓库地址> (push) 新增一个远程仓库 git remote add origin-github <githu…

PDM系统中的项目管理是什么意思?

在当今信息化时代&#xff0c;企业面对海量的产品数据和信息&#xff0c;如何高效地管理这些数据成为了关键问题。而PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;以其强大的数据高效管理功能&#xff0c;为企业带来了诸多好处。我们以最新…

HarmonyOS 开发基础(四) 子父组件双向绑定

一、知识点在代码注释里 index.ets // 导出方式直接从文件夹 import MyInput from "../common/commons/myInput" Entry Component /* 组件可以基于struct实现&#xff0c;组件不能有继承关系&#xff0c;struct可以比class更加快速的创建和销毁。*/ struct Index {…

NullPointerException导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、 Framework 层对象 空指针导致手机重启。二、解决方案&#xff0c;规避空指针三、Telecom APK 控制导致的重启举例 一、 Framework 层对象 空指针导…

【Linux】Centos7 的 Systemctl 与 创建系统服务 (shell脚本)

Systemctl systemctl 命令 # 启动 systemctl start NAME.service # 停止 systemctl stop NAME.service # 重启 systemctl restart NAME.service # 查看状态 systemctl status NAME.service # 查看所有激活系统服务 systemctl list-units -t service # 查看所有系统服务 syste…