目录
- 工具: vmware workstation player ubuntu18.04 代码编辑器(notepad++/vscode) SecureCRT
- 问题引入: 如何设置共享文件夹? Linux有哪些常用指令? 如何进行交叉开发? 如何查看C语言库函数的使用说明? 如何使用C语言进行文件操作?
设置共享文件夹
- 设置一个文件夹(目录),使得两个操作系统(windows和linux)能同时访问到,可以方便操作。
- 我们一般习惯在Windows系统写代码,当我们需要在Linux系统编译文件时,需要将Windows的文件传到Linux系统,设置一个共享文件夹的话,可以使得两个系统可以同时访问到,大大地方便了操作。
- 设置过程:- 打开虚拟机->菜单->管理->虚拟机设置->选项->共享文件夹->总是启用。- 点击添加按钮->弹出添加向导->点击浏览按钮,从windows中选择一个文件夹,确定即可。
- 验证:- 打开ubuntu底部的《文件》图标->其它位置->计算机->mnt->hgfs-> 刚刚设置的共享文件夹。- 打开共享文件夹就可以访问到里面的文件了。
Linux基础
- 常用指令
pwd 打印当前的工作路径
cd 用于切换路径(文件夹/目录)
格式:cd 路径名
ls 列出指定目录下的文件名
格式:ls 路径名(可省略不写)
clear 清屏
touch 文件名字 创建文件
vi/vim 编辑器
有两种模式:
第一种:命令模式:按下i,进入编辑模式!
第二种:编辑模式:按下esc这个键,进入命令模式
退出vi的方式有三种
语法:进入命令行模式:写入 " : " ,之后我们再进行下一步操作
暖男的方式:q 它会询问你,是否要保存
渣男的方式:x 不管系统,直接退出并且保存
正常人:wq 退出并且保存!
ls 查看列表
可以将你当前目录的所有文件名打印出来
cd 切换目录的指令
使用方法: cd 目录名
cd /mnt/hgfs/NHDXshare
cd . 表示进入当前目录
cd .. 表示进入上一级目录
pwd 查看你的当前目录的绝对路径
mkdir 创建一个目录
使用方法: mkdir 目录名
mv 移动一个文件
假设我要把data里面的1.txt移动到note里面去,该如何做??
mv ./1.txt ../code
cp 复制一个文件
假设我要把code里面的1.txt复制一份到data里面去,该如何做?
cp ./1.txt ../data
- linux路径说明 在linux中,所有的路径都是从 / 开始的,称之为根目录。 我们把以/开始的路径,称为绝对路径,例如:/mnt/hgfs/20220618 那些不是以/开始的路径,称为相对路径,例如: code/ 在一个路径中,除了根目录之外的斜杠,称为路径分隔符。
在linux中,有几个特别的符号,表示某种特定的路径:
~ 表示home目录,一般完整形式可能是: /home/china
典型用法: cd ~
. 表示当前路径
典型用法: ./xxx
.. 表示当前路径的上一级目录
典型用法:
cd ..
- 表示上一次所在的路径
典型用法:
cd -
第一个C程序
- 编写程序(在windows中编写代码) 推荐使用vscode编写,文件保存在之前设置的共享文件夹。
#include<stdio.h>intmain(){printf("hello world\n");return0;}
- 切换到ubuntu中,进行编译 先切换到共享文件夹,然后进行编译
cd 共享文件夹路径
gcc xxx.c(文件名) -o xx(文件名)
cd /mnt/hgfs/code
gcc 00-hello.c -o hello
- 执行
./hello
我们可以看到编译00-hello.c文件后,执行hello文件后打印 hello world,打开共享文件夹可以看到编译后的hello文件。
SecureCRT连接GEC6818开发板
- 步骤: 快速连接->参数配置->1、选择Serial->2、选择开发板所连接的端口->3、波特率选择115200->4、不勾选->5、选择默认
(右键此电脑->管理->系统工具->设备管理器->端口,即可查看serial所连接的端口号,我的电脑连接的时com5,所以选择com5)
- 创建工作文件夹
mkdir -p /文件名
交叉开发
- 步骤 1、编写程序 2、切换到ubuntu中,进行交叉编译
arm-linux-gcc xxx.c -o xxx.arm
3、把生成的xxx.arm传输到GEC6818开发板
- 打开CRT连接开发板,进入自己的工作目录 (如果没有工作目录,需要先创建: mkdir -p /0618) - cd /0618
- 执行传输指令 - rx 待发送的文件名 (回车,菜单->传输->发送xmodem->在弹出的文件对话框中选择要发送的文件)- 例: rx hello.arm
选择发送Xmodem
选择要传输的文件
4、添加执行权限
- chmod +x 文件名
- 例: chmod +x hello.arm
5、执行
./hello.arm
编译 .c文件
文件IO
使用linux操作系统的好处:它提供了丰富的人机交互功能,或者说是人机的交互界面!
- Linux的应用开发:- Everything is a file in linux- 在linux下面,一切皆文件!!- 在linux下面,所有的一切都是被当作一个文件来使用的。
- 操作文件的步骤:- 1、打开冰箱 -> 打开文件 open- 2、把大象放到冰箱 -> 操作文件 read/write- 3、关闭冰箱 -> 关闭文件 close
- C语言库给我们提供了很多函数!- 查询函数的语法:man 你要查询的东西!!- man 2 open 2表示文档的第二页
文件操作
打开文件open
- const char *pathname: 不可在本函数内部进行更改的一个路径名
- int flags: 打开文件的方式- O_RDONLY 只读- O_WRONLY 只写- O_RDWR 可读可写!!
- 返回值:- 打开文件成功,返回一个整数,这个整数是>0的,称之为文件描述符;- 打开文件失败,返回-1;
读文件read
NAME
read - read from a file descriptor
从一个文件描述符中去读取数据
SYNOPSIS
#include<unistd.h>ssize_tread(int fd,void*buf,size_t count);int fd : fd 表示是文件描述符!!也就是open的返回值!
void*buf :用来保存你从这个文件(fd)当中读取到的内容,我们一般用字符数组来保存
size_t count : 你想要从文件中去读取多少个字节!!
返回值:
成功,返回读到的字节数
失败:返回-1
当文件读取完了,返回一个 0;
写文件
NAME
write - write to a file descriptor
向文件描述符中里去写数据
SYNOPSIS
#include<unistd.h>ssize_twrite(int fd,constvoid*buf,size_t count);int fd : 文件描述符
constvoid*buf : buf 是保存你要写入到文件里面去的数据
size_t count : 你想写入文件数据的大小,或者说你想写多少字节到文件当中去!
返回值:
成功,返回实际上写入的字节数
失败,返回-1
关闭文件 close
NAME
close - close a file descriptor
关闭文件
SYNOPSIS
#include<unistd.h>intclose(int fd);int fd : 其实就是我们前面open这个函数的返回值,也就是一个文件文件描述符!!
移动光标 lseek
NAME
lseek - reposition read/write file offset
SYNOPSIS
#include<sys/types.h>#include<unistd.h>off_tlseek(int fd,off_t offset,int whence);int fd : 你要操作的那个文件的文件描述符
off_t offset : 偏移量
>0 往后偏移
<0 往前偏移
=0 不动
int whence : 光标定位的方式
1、是文件的开头 SEEK_SET:基于文件的开头
2、是文件的结尾 SEEK_END:基于文件的结尾
3、是文件的当前位置 SEEK_CU:基于光标的当前位置
返回值:
失败,返回-1
成功,返回新光标到文件开头的位置
例如:
我想把光标定位在文件结尾处:lseek(fd,0,SEEK_END);
练习
- 从一个文本中读取内容 使用open read close 这个三个函数对文件进行操作! 读取文件的内容,然后输出buf
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(){//打开文件//打开文件成功的话,我们就返回一个整数,这个整数(文件描述符)是>0!!//打开文件失败就返回-1;int fd =open("./1.txt",O_RDWR);if(fd ==-1){printf("open error\n");return-1;}//操作文件char buf[10]={0};int ret =read(fd, buf,5);if(ret ==-1){printf("read error\n");return-1;}if(ret ==0){printf("read over\n");return1;}printf("%s\n",buf);close(fd);return1;}
- 定义一个数组,然后你把数组的内容写入到文件2.txt当中去!!
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(){int fd =open("./2.txt",O_RDWR);if(fd ==-1){printf("open error\n");return-1;}//写文件char buf[10]={'a','b','c','2','3'};//字符数组//char *buf1 = "asdff12";//字符串int ret =write(fd, buf,5);if(ret ==-1){printf("write error\n");return-1;}close(fd);return0;}
- 利用lseek这个函数,用代码算出文件的大小!!
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdio.h>intmain(){//打开文件int fd =open("./biji.md",O_RDWR);if(fd ==-1){printf("open error\n");return-1;}//它的返回值是新光标到文件开头的位置int num =lseek(fd,0,SEEK_END);printf("num = %d\n", num);close(fd);return0;}
- 假设你有一个文件:1.txt,我要求你把1.txt的内容全部复制到2.txt里面,要求复制1.txt里面的内容到2.txt里面
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(){int fd =open("./1.txt",O_RDWR);int fd1 =open("./2.txt",O_RDWR);if(fd ==-1){printf("open error\n");return-1;}if(fd1 ==-1){printf("open error\n");return-1;}//操作文件char buf[2]={0};while(1){int ret =read(fd, buf,1);if(ret ==-1){printf("read error\n");return-1;}if(ret ==0){printf("read over\n");break;}int ret1 =write(fd1, buf,1);if(ret1 ==-1){printf("write error\n");return-1;}}close(fd);close(fd1);return1;}
下一篇
粤嵌GEC6818-学习笔记2-屏幕相关及音频播放https://blog.csdn.net/weixin_45735391/article/details/125452935
版权归原作者 蓝净云 所有, 如有侵权,请联系我们删除。