0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux开发_介绍目录编程、标准文件编程

DS小龙哥-嵌入式技术 2022-09-17 15:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

【摘要】 介绍Linux下目录编程、标准文件编程、Linux系统文件接口编程、GDB调试等知识点。

任务1:目录操作

学习系统编程: 主要学习系统函数的调用。

#include

/*

int argc :表示传入的参数数量

char **argv:存放传入的参数数据,本身是一个二维数组。

argv[0] 表示第一个参数

argv[1] 表示第二个参数

*/

int main(int argc,char **argv)

{

int i;

for(i=0;i;i++)<>

{

printf("argv[%d]=%s\n",i,argv[i]);

}

return 0;

}

文件操作函数: fopen、fclose、fread、fwrite…………

目录操作函数:

#include

#include

DIR *opendir(const char *name); //打开目录

struct dirent *readdir(DIR *dirp); //读取目录信息

int closedir(DIR *dirp); //关闭目录

struct dirent {

ino_t d_ino; /* inode number */

off_t d_off; /* offset to the next dirent */

unsigned short d_reclen; /* length of this record */

unsigned char d_type; /* type of file; not supported by all file system types */

char d_name[256]; /* filename 文件名称 */

};

​ (练习目录操作)

1.​实现ls *.c 类似的功能。 产品: 视频播放器、音乐播放器

2.​强化第一题。ls *.c

(1)​拼接路径: /mnt/hgfs/linux-share-dir/test/test.c (通过命令行传入路径)

示例:./a.out ./work/test .c

结果: ./work/test/123.c ./work/test/456.c

(2)​获取绝对路径: /mnt/hgfs/linux-share-dir/test/test.c

示例:./a.out ./work/test .c

结果: /user/work/test/123.c /user/work/test/456.c

3.​实现目录的拷贝。 类似cp命令

int mkdir(const char *pathname, mode_t mode);

(1)​实现一层目录的拷贝。

(2)​实现所有目录的拷贝。(扩展)

char *strstr(const char *haystack, const char *needle);

const char *haystack:在哪里查找

const char *needle:查找的数据

返回值: 返回查找到的数据的首地址

4.​实现cat命令效果

(1)​示例: cat 123.c

(2)​示例: cat 123.c -n (扩展作业)

5.​实现du命令的功能。

(1)​示例: du 123.c 显示出文件的大小

(2)​示例: du 123.c -h 使用合理的单位显示出文件的大小(扩展作业)

1.1 获取当前目录绝对地址相关函数

#include

char *getcwd(char *buf, size_t size);

char *getwd(char *buf);

char *get_current_dir_name(void); //获取绝对路径

int chdir(const char *path); //修改当前目录,即切换目录,相当于 cd 命令

1.2 mkdir函数创建目录

#include

#include

int mkdir(const char *pathname, mode_t mode); // 777

#include

#include

mode_t umask(mode_t mask); //设置创建目录或者文件的默认权限

一般在调用mkdir时,需要先调用umask(0);

mode_t mode参数的填写说明:

S_IRWXU 00700 user (file owner) has read, write and exe-cute permission

S_IRUSR 00400 user has read permission

S_IWUSR 00200 user has write permission

S_IXUSR 00100 user has execute permission

S_IRWXG 00070 group has read, write and execute permis-sion

S_IRGRP 00040 group has read permission

S_IWGRP 00020 group has write permission

S_IXGRP 00010 group has execute permission

S_IRWXO 00007 others have read, write and execute per-mission

S_IROTH 00004 others have read permission

S_IWOTH 00002 others have write permission

S_IXOTH 00001 others have execute permission

1.3 获取目录和文件的状态信息

#include

#include

#include

int stat(const char *path, struct stat *buf); //直接获取源文件的状态()

int fstat(int fd, struct stat *buf); //获取已经打开成功的文件状态

int lstat(const char *path, struct stat *buf); //不区分链接文件

//存放文件的状态信息

struct stat {

dev_t st_dev; /* ID of device containing file */

ino_t st_ino; /* inode number */

mode_t st_mode; /* protection */

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; /* 保存文件的大小*/

blksize_t st_blksize; /* blocksize for file system I/O */

blkcnt_t st_blocks; /* number of 512B blocks allocated */

time_t st_atime; /* time of last access */

time_t st_mtime; /* time of last modification */

time_t st_ctime; /* time of last status change */

};

m的参数:-->st_mode

S_ISREG(m) 判断是否是普通文件

S_ISDIR(m) directory? 目录

S_ISCHR(m) character device?

S_ISBLK(m) block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

任务2:带缓冲区的文件IO操作

文件中的3个标准指针:

stderr Standard error output stream. 存放标准错误信息的文件

stdin Standard input stream. 存放标准输入信息的文件

stdout Standard output stream. 存放标准输出信息的文件

​示例:

#include

int main()

{

char buff[10];

while(1)

{

if(fread(buff,1,10,stdin)>0)

{

printf("读出的数据=%s\n",buff);

}

}

return 0;

}

带缓冲区:这一系列函数适合操作普通文件。

size_t fread(void *restrict, size_t, size_t, FILE *restrict);

int fseek(FILE *, long, int);

size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict);

int fclose(FILE *);

任务3:非缓冲区的文件IO操作

open()

#include

#include

#include

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode); //在创建文件的时候才调用。

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

int close(int fd);

​作业

1.​练习read、write读写函数。

2.​将cat命令编写使用open一系列函数实现。

3.​将stat文件状态的时间转为标准时间打印出来。

st_atime=1516528093

st_mtime=1516586761

st_ctime=1516586761

以上3个值是秒单位的时间。 是从1970年1月1日0时0分0秒开始计算。

格式: xxxx年xx月xx日 xx时:xx分:xx秒 星期x

转换时间:(写出一个类似于时钟的程序,可以加一个闹钟,判断时间是否到达)

(1)​编写一个函数实现秒单位的时间转为标准时间

(2)​编写一个函数实现将标准时间转为秒单位

#include

int main(int argc,char**argv)

{

while(1)

{

long cnt=time(NULL); //获取当前系统时间

sleep(1); //睡眠一秒钟

printf("cnt=%d\n",cnt);

}

return 0;

}

4.​扩展作业:重写一个scanf与printf函数。

int printf(const char *format, ...);

int scanf(const char *format, ...);

…可变形参

任务4:安装编辑器

​压缩与打包名称

.1.1 解压命令的使用格式: tar -xvf <压缩文件的名称>

1.1.​想要指定解压之后文件存放的位置: tar -xvf <压缩文件的名称> -C <指定的目录>

1.2 打包指定文件夹或者文件: tar -cvf <新文件的名称> <要打包的目录>

示例: [root@wbyq test]# tar cvf SublimeText2.tar SublimeText2

注意:压缩包不能直接在共享目录下解压。

​运行软件:

(1)​# ./sublime_text

(2)​# ./sublime_text & (后台运行程序)

​切换中文输入法:Ctrl+空格

​linux操作系统保存可执行文件的环境变量: PATH

(1)​打印环境变量的值:echo $PATH

pYYBAGMlPD6Aa3ULAACW_djF3yo579.png

(2)修改环境变量:# vim /etc/profile (系统开机的时候自动执行)

poYBAGMlPD-AMQi6AADSYnDeXQo992.png

(3) source命令立即生效环境变量。(只是针对当前的终端)

示例:# source /etc/profile

任务5: GDB调试器

使用GDB调试工具: gdb <可执行文件的名称>

示例: gdb a.out

要支持调试程序,需要在gcc编译的时候加上-g选项参数。

示例:gcc -g 123.c

​常用的命令:

breakpoints -- 设置程序的断点(简写b)。 语法: b <行号>或者 b <函数名称>

running -- 开始运行程序(简写run)

list -- 打印出当前的代码

next -- 单步调试

quit -- 退出调试界面


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11631

    浏览量

    218028
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96778
  • GDB调试
    +关注

    关注

    0

    文章

    24

    浏览量

    1757
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式ElfBoard-Linux系统中的文件分类

    从本质上讲,Linux系统就是由文件组成的,一切皆文件linux系统设计的核心理念,接下来介绍一下文件
    发表于 12-09 08:59

    Linux新手通关!5分钟掌握文件/目录管理,告别“找不到北”

    新手入门:Linux 文件 / 目录管理实操指南 刚上手 Linux 的小伙伴,是不是常陷入这些 “混乱时刻”:想找的文件藏在层层
    的头像 发表于 11-17 10:42 180次阅读
    <b class='flag-5'>Linux</b>新手通关!5分钟掌握<b class='flag-5'>文件</b>/<b class='flag-5'>目录</b>管理,告别“找不到北”

    一文了解Mojo编程语言

    编程能力 允许直接进行系统调用和文件操作,提供类似 Rust 的内存安全机制(所有权和借用检查),避免运行时错误。 支持零成本抽象,开发者无需牺牲性能即可编写高层代码。 并行与异构计算 内置对多核
    发表于 11-07 05:59

    Linux 编程语言盘点:从内核到AI的全栈选择

    ,认为那才代表未来。 其实,这个问题没有标准答案。不同语言在 Linux 上的角色,就像工业系统里的不同模块——各司其职,协同配合。 今天,我们从工业开发者的视角,聊聊这个绕不开的话题。 一、
    的头像 发表于 11-06 17:05 436次阅读

    飞凌嵌入式ElfBoard-系统应用编程文件I/O

    1.1 文件I/O的简单概念本章节仅作为初识简单概念,在后续章节会对相关概念进行深入介绍。在linux系统中有一个概念,一切皆文件,所有的设备都以
    发表于 10-24 08:57

    Linux系统目录结构全面剖析

    Linux文件系统采用层次化的目录结构,这种设计遵循了Unix哲学中的"一切皆文件"原则。理解Linux
    的头像 发表于 07-21 17:33 610次阅读

    【HZ-T536开发板免费体验】2 - 交叉编译仓颉编程语言程序到开发板运行

    AARCH64的编译器(我使用的是WSL2): sudo apt install gcc-aarch64-linux-gnu 然后需要拷贝aarch64开发包中以下三个目录文件到x
    发表于 07-16 21:27

    Linux中,用新设置对CY7C65215重新编程后,如何启用新设置?

    Linux 中,用新设置对 CY7C65215 重新编程后,如何启用新设置? 软件重置或POWER_DRILL2GO循环? 3.是否有文件教客户如何使用第 1 项和第 2 项?
    发表于 05-26 08:23

    Linux文件系统打包及镜像制作,触觉智能RK3562开发板演示

    本文介绍Linux开发文件系统打包及镜像制作的方法,演示Linux文件系统打包及镜像制作,适用
    的头像 发表于 04-28 16:45 777次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>文件</b>系统打包及镜像制作,触觉智能RK3562<b class='flag-5'>开发</b>板演示

    从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

    使用的u-boot源码路径为:开发板资料盘(A 盘)\4_SourceCode\3_Embedded_Linux\资源文件\出厂镜像相关,在该目录下有一个名为
    发表于 03-20 16:48

    支持远程脱机密文下载加密芯片SMEC系列编程开发介绍

    这里主要介绍下SMEC80ST、SMEC88SP/ST、SMEC98SP编程开发板(后文简称SMEC编程器)的远程脱机密文下载功能。芯片资料可在http://www.sinormou
    发表于 02-14 16:19

    编程交流负载标准

    编程交流负载标准是电力电子测试领域的重要组成部分,它为交流电源、变频器、逆变器等设备的测试提供了标准化的负载条件。这种可编程性使得测试更加灵活和精确,能够满足不同设备和应用场景的需求
    发表于 01-15 13:53

    支持远程脱机密文下载加密芯片SMEC编程开发介绍

    被监听,这些数据也无法下载到别的加密芯片。下面具体介绍密文数据产生和下载流程:1、从需要下载密文文件的SMEC编程器上获取安全码。2、开发者填入安全码,选择需要加密的目标下载Hex
    发表于 01-08 11:30

    gitee 支持的编程语言有哪些

    Gitee(码云)是一个基于 Git 的代码托管和研发协作平台,类似于 GitHub 和 GitLab。它支持多种编程语言,允许开发者托管和管理代码,进行版本控制,以及协作开发。以下是一些
    的头像 发表于 01-06 09:50 1111次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-内核源代码的目录结构和文件说明

    Linux内核目录下有很多的文件夹和文件,很多文件夹和文件我们不需要关注,我们主要了解比较
    发表于 12-16 13:04