linux系统编程之二

1)mmap内存映射的案例(映射为int类型)

#include<sys/types.h>
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<error.h>
#include<errno.h>
#include<unistd.h>
#include<sys/mman.h>int main(int argc, char** argv)
{int fd = open("test.txt",O_RDWR);if(fd < 0){perror("open file");exit(1);}void* p = mmap(NULL,6,PROT_WRITE,MAP_SHARED,fd ,0); //创建一个内存映射关系int* iptr = (int*)p;iptr[0] = 0x30313233;munmap(p,6); //取消一个内存映射关系return 0;
}2)内存映射的案例(映射为char类型)
int main(int argc, char** argv)
{int fd = open("test.txt",O_RDWR);if(fd < 0){perror("open file");exit(1);}void* p = mmap(NULL,6,PROT_WRITE,MAP_SHARED,fd ,0); //创建一个内存映射关系char* iptr = (char*)p;iptr++;iptr[0] = 0x34;iptr[1] = 0x35;  munmap(p,6); //取消一个内存映射关系return 0;
}

2)od命令的使用,及vim的两种查找方式

1)按字符形式和16进制形式显示一个文本;od命令使用od -tx1 -tc test.txt //如果是按十进制的,这样:od -td1 -tc test.txt//vim查找的两种格式:
2)如果是自己的文件,用vim打开的话,查找文件是":/xxx",如果是如man 2 mmap等打开系统参考文件的话,不要有":",直接“/xxx”即可;
3)TCGETS的:TC意思是终端控制
4)ls -R 递归打印文件;如果是目录,目录里面还有文件的话;

3)inode-Table和data block,用的是stat系统函数;

常规文件:文件的数据存储在数据块中;
目录:该目录下的所有文件名和目录名存储在数据块中。(注意:文件的其他信息保存在该文件的inode中);
所以,从上面看,如果要查看一个文件,需要不断的在inode和数据块中来回反复横跳;
说明:".",这个点就是记录的当前的inode信息,".."记录的是上一层的inode信息;
文件夹的大小一般都是4096字节的整数倍;
如果需要stat函数编程,最好参考linux手册;5)课后学习这些函数(都和inode相关的)
access chmod fchmod chown fchown utime truncate link unlink rename readlink mkdir rmdir
通过不断学习,系统函数的有两种传参,第一个是路径,另外一个是文件描述符fd;如stat,fstat等待;有'l'的,就和软链接有关,如lstat函数;
软链接是真正创建了一个inode文件!!! 硬连接是给一个文件起了一个别名。
跟踪程序的系统调用:使用方法: strace命令: strace ./target 或者是strace ls,查看ls命令的系统调用;

4)利用openDir,readDir closeDir及stat等函数,设计一个简单的ls -R命令;

/*功能:*实现一个简易的ls -R功能,将目录里的内容,遍历打印出来。*文件的名字及目录深度不能太长,否则会报错;
*/
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<error.h>
#include<errno.h>
#include<unistd.h>
#include<sys/stat.h>
#include<dirent.h>
#include<sys/ioctl.h>
#include<string.h>void printDir(char*  path)
{char pathname[1024];DIR* dir;struct dirent* dp;struct stat st;dir = opendir(path); while(dp = readdir(dir)) //只要是文件夹不为空,就读;自己写的可以{if( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") )    continue;         sprintf(pathname,"%s/%s",path,dp->d_name); //字符串拼接stat(pathname,&st);if(S_ISDIR(st.st_mode)) //是否是路径{printDir(pathname); //如果是路径,则递归调用printDir}else if(S_ISREG(st.st_mode)){printf("%s\t",dp->d_name);}}putchar(10);closedir(dir);
}int main(int argc, char** argv)
{if(argc < 2){perror("open file");exit(1);}    printDir(argv[1]);return 0;
}

5)dup和dup2彻底的学会了,案例代码如下:

#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<fcntl.h>
//dup:    和返回值有关系:    是复制一个fd,让dup返回的fd和参数fd指向同一个文件;dup函数一个参数
//dup2:   和返回值没关系;    是将新的fd和旧的fd指向同一个文件,dup2是两个参数;
int main(int argc, char** argv)
{int fd ,save_fd;fd = open("test.txt",O_RDWR); //fd应该是3;if(fd < 0){perror("open file");exit(1);}save_fd = dup(1);  //save_fd 应该是4,从最小开始dup2(fd,1); //让1指向fd,fd = 3;close(fd); //不是真正关闭//经过上面3条语句,4指向了out,1指向了test.txt;write(1,"hello",6); //标准输出上,把数据写到test.txt文件里面;dup2(save_fd,1); //还原write(1,"hello",6); //标准输出上,可以打印到屏幕上;close(save_fd);return 0;
}

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

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

相关文章

云技术分享 | 快速构建 CodeWhisperer 代码生成服务,让 AI 辅助编程

前言 Amazon CodeWhisperer 是 2023 年 4 月份发布的一款通用的、机器学习驱动的代码生成器服务&#xff0c;CodeWhisperer 经过数十亿行 Amazon 和公开可用代码的训练&#xff0c;可以理解用自然语言&#xff08;英语&#xff09;编写的评论&#xff0c;可在集成式开发环境 (…

iOS代码混淆工具推荐:IPA Guard详细介绍

iOS代码混淆工具推荐&#xff1a;IPA Guard详细介绍 目录 摘要&#xff1a; 引言 正文 1. IPA Guard概述 2. IPA Guard的功能特性 3. IPA Guard的混淆模式 4. 支持的语言 5. 使用场景 总结 参考资料 总结 参考资料 摘要&#xff1a; 了解并选择合适的iOS代码混淆工…

uniapp订单循环列表倒计时

目录 效果图片插件uni-countdown代码最后 效果图片 插件uni-countdown 地址 代码 <template><view class""><!-- 下面循环两个列表 --><view class"item" v-for"(item, index) in listData" :key"index">&…

LeetCode 2 两数相加

题目描述 链接&#xff1a;https://leetcode.cn/problems/add-two-numbers/?envTypefeatured-list&envId2ckc81c?envTypefeatured-list&envId2ckc81c 难度&#xff1a;中等 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式…

【Hello Algorithm】暴力递归到动态规划(三)

暴力递归到动态规划&#xff08;三&#xff09; 最长公共子序列递归版本动态规划 最长回文串子序列方法一方法二递归版本动态规划 象棋问题递归版本动态规划 咖啡机问题递归版本动态规划 最长公共子序列 这是leetcode上的一道原题 题目连接如下 最长公共子序列 题目描述如下…

在 rider 里用配置 Perforce(P4)的注意事项

整个配置界面里&#xff0c;关键就配2处位置&#xff0c;但是都有些误导性。 1是连接形参的4个参数都得填&#xff0c;字符集看你项目的要求&#xff0c;这里工作区其实指的是你的工作空间&#xff0c;还不如显示英文的 Workspace 呢&#xff0c;搞得我一开始没填&#xff0c;…

【数字IC设计】DC自动添加门控时钟

简介 数字电路的动态功耗主要是由于寄存器翻转带来的&#xff0c;为了降低芯片内部功耗&#xff0c;门控时钟的方案应运而生。作为低功耗设计的一种方法&#xff0c;门控时钟是指在数据无效时将寄存器的时钟关闭&#xff0c;以此来降低动态功耗。 在下图中&#xff0c;展示了…

软信天成:流程管理是企业精细化管理的一大利器

流程管理&#xff08;BPM&#xff09;是指组织和管理内部或跨部门的工作流程&#xff0c;主要包括设计、建模、执行、监控和优化业务流程&#xff0c;确保工作按照标准化的步骤进行&#xff0c;从而提高效率、降低成本&#xff0c;促进业务增长。 一、流程管理生命周期五大步骤…

基于python的23种设计模式

以下是基于Python实现的23种设计模式及代码段和详细解释&#xff1a; 1. 工厂模式&#xff08;Factory Pattern&#xff09; 简介 工厂模式是一种创建型设计模式&#xff0c;它允许客户端代码通过工厂方法创建对象&#xff0c;而无需直接实例化对象。在工厂方法模式中&#…

Hadoop3教程(九):MapReduce框架原理概述

文章目录 简介参考文献 简介 这属于整个MR中最核心的一块&#xff0c;后续小节会展开描述。 整个MR处理流程&#xff0c;是分为Map阶段和Reduce阶段。 一般&#xff0c;我们称Map阶段的进程是MapTask&#xff0c;称Reduce阶段是ReduceTask。 其完整的工作流程如图&#xff…

2023亿发智能数字化解决方案供应商,贵州一体化企业信息管理系统

企业数字化服务的解决方案是指运用数字技术对企业运营进行全方位的数字化升级和优化&#xff0c;提供以数字化服务为核 心的全面解决方案&#xff0c;解决企业在数字化转型过程中面临的技术和业务难题。 数字化服务解决方案的功能 在数字化时代的背景下&#xff0c;贵州企业的…

ES6箭头函数

1.箭头函数的写法 如果函数内有返回值 var fn v > v 1 返回值如果不是表达式(是对象)&#xff0c;用()括号返回 var fn v > ({ obj: v }) 返回值如果不是表达式(也不是对象)方法体内按正常写 var fu () > {var a 1;var b a1;return b; } 2.箭头函数和普通…

【微信小程序】数字化会议OA系统之首页搭建(附源码)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

【SA8295P 源码分析 (一)】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码)

【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码) 一、APPS PBL(Application Primary Boot Loader):固化在CPU ROM中1.1 APPS PBL 加载 XBL Loader1.2 XBL Loader加载验证并运行SMSS进行自检,自检完成后触发Warm Reset1.3 WarmRest后,APPS…

Java8 新特性之Stream(六)-- Stream的顺序流(Stream)与并行流(parallelStream)的图解

目录 1. 顺序流(Stream)与并行流(parallelStream)的区别: 2. 顺序流(Stream)与并行流(parallelStream)的图解:

警惕这款记录音频和电话的Android木马软件SpyNote

导语&#xff1a;近日&#xff0c;一款名为SpyNote的Android木马软件被揭示出其多样化的信息收集功能。该木马软件通常通过短信钓鱼攻击传播&#xff0c;攻击链通过欺骗潜在受害者点击嵌入链接来安装该应用程序。除了要求入侵性权限以访问通话记录、摄像头、短信和外部存储等&a…

element ui this.$msgbox 自定义组件

this.$msgbox({title: "选择", message: (<com1figs{this.figs} on-selected{this.new_selected}></com1>),showCancelButton: false,showConfirmButton: false,}); 运行报错 Syntax Error: Unexpected token (89:20) 参考&#xff1a; https://gith…

二叉树模板

根据先序遍历建树 const int N2e610; struct node {char date;int l,r; }str[N]; string s; //读入先序遍历 int cnt,idx; int build() {if (s[cnt]#){cnt;return 0;}str[idx].dates[cnt];int nowidx;str[now].lbuild();str[now].rbuild();return now; }int ubuild();//返回根节…

python+django高校体育乒乓球场地预约管理系统_s2409

本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;乒乓球场管理,场地类型管理,场地预约管理,暂离申请管理,离开申请管理,管理员管理,留言反馈,系统管理等诸多功能进行管理。本系统对于用户输入的任何信息都进行了一定的验证&#xff0c;为管理员操…

C++项目实战——基于多设计模式下的同步异步日志系统-⑫-日志宏全局接口设计(代理模式)

文章目录 专栏导读日志宏&全局接口设计全局接口测试项目目录结构整理示例代码拓展示例代码 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;C…