LINUX,基础学习

1.Linux目录结构以及文件操作

下面,我们通过对Linux与Windows区别分析,来引出我们Linux的学习 首先Linux与Windows都是操作系统,但是Linux常常用于嵌入式设备中。Ubuntu属于Linux的发行版,带有 图形界面。但是跑在嵌入式设备中的Linux操作系统往往不带图形界面,直接用命令行来操作。因为图形界面 会占用大量的资源,然而嵌入式本身就是对资源特别敏感的一个领域,所以一般不用图形界面。但是习惯于 使用命令行进行操作,也会对我们的开发形成很大的便利。

ps: Windows其实也可以使用命令行,但是嵌入式设备一般不使用Windows。

2.Linux命令操作的目的 Windows采用的命令:DOS命令 Linux采用的命令:Shell命令 问:我们首先需要搞清楚,采用这些命令,我们要做什么? 答:我们采用命令,是为了操作文件。 比如说,访问某个目录,或者访问某个文件或者查找某个文件 等等等等。。。

3.Linux文件目录分布

4.常用的Linux指令

cd+文件夹名字: 访问某个文件夹

ls:显示当前所在目录的文件

touch+文件名:创建文件

rm+文件名:删除文件

mkdir+目录名:创建目录

rm -rf + 目录名:删除目录

TAB键:补全

sudo + 命令:用管理员权限执行命令

pwd: 显示当前目录的绝对路径

5.vi编辑器的简单使用

        vi是一种方便的代码编辑器,Linux系统一般是自带的 vi和vim的区别:vim是vi的升级版,基础功能两者一致,不过在嵌入式开发板中 只有vi没有vim,但是在Ubuntu上我们可以使用vim编辑器,它的功能更加丰富。 这里只讲解vi编辑器基础用法,如果使用vim编辑器需要手动安装vim编辑器

6.vi 常用的两种模式

1.命令行模式:按ESC进入,在这个状态下,可以输入命令常用命令 :

+ 行号:跳转到某一行

G:跳转到文本末尾

yy: 复制某一行,复制的位置由光标所在位置决定

yx:复制若干行,x代表行数,输入2,就是复制当前行和它下面的两行(总共三行), 复制的位置由光标所在位置决定。

p:把刚刚复制的内容进行粘贴,粘贴的位置由光标所在位置决定

:+wq 保存文本并退出

:+q 正常退出文本

:+q! 强制退出文本

:set nu 程序显示行号

:dd 删除一行

ESC: gg=G 自动整理代码

1.Open函数

高频使用的Linux系统调用:open write read close Linux

自带的工具:man手册: man 1是普通的shell命令,比如ls

man 2是系统调用函数,比如open,write说明

在Linux系统库的定义:

int open(const char *pathname, intflags); /* 比较常用*/
int open(const char *pathname, intflags, mode_tmode);
//包含的头文件:
#include <sys/types.h>//这里提供类型pid_t和size_t的定义
#include <sys/stat.h>
#include <fcntl.h>

底层是一个宏,它可能以十六进制的形式存放。 O_RDONLY:只读模式 0x 0000 0000 O_WRONLY:只写模式 0x 00000001 O_RDWR:可读可写 0x 00000002

O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。0x00002000

O_CREAT 表示如果指定文件不存在,则创建这个文件 0x0000 0100

O_EXCL 表示如果要创建的文件已存在,则出错,同时返回-1,并且修改errno 的值。

O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。

O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端

2.Close函数

Linux文件权限 Linux 系统中采用三位十进制数表示权限,如0755, 0644. 7 1+2+4 5 1+4 5 1+4 ABCD A- 0, 表示十进制 B-用户 C-组用户 D-其他用户

‐‐‐ ‐> 0 (no excute , nowrite ,no read)
‐‐x ‐> 1 excute, (nowrite, no read)
‐w‐ ‐> 2 write
r‐‐ ‐> 4 read
‐wx ‐> 3 write, excute
r‐x ‐> 5 read, excute
rw‐ ‐> 6 read, write 

3.Write函数

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

fd: 文件描述符

*buf: 写入的数据的首地址

count: 写入数据个数

返回值:如果顺利write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错误代码存入errno

#include <sys/types.h>
  2 #include <sys/stat.h>
  3 #include <fcntl.h>
  4 #include <stdio.h>
  5 #include <unistd.h>
  6 #include <string.h>
  7 
  8 //ssize_t write(int fd, const void *buf, size_t count);
  9 
 10 // int open(const char *pathname, int flags);
 11 // int open(const char *pathname, int flags, mode_t mode);
 12 
 13 int main()
 14 {
 15     int fd;
 16     char writebuff[128] = {0};
 17     char *test = "hello world";
 18     strcpy(writebuff,test);
 19 
 20     fd = open("mm",O_RDWR|O_CREAT , 0755);
 21     if(fd == -1)
 22    {
 23       printf("open mm failed\n");
 24       return -1;
 25    }
 26      printf("open success\n");
 27      int len = write(fd, &writebuff[0], 11);
 28 
 29      if(len == -1)
 30         printf("write failed\n");
 31      close(fd);
 32     return 0;
 33 }

cat:  查看文件

4.Read函数

ssize_tread(int fd,void * buf, size_tcount);

fd: 文件描述符

*buf: 读入数据的首地址

count: 读入数据的个数

返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read 返回0

main函数参数

C语言规定了main函数的参数只能有两个,一个是argc,一个是argv并且,argc只能是整数,第二个必须是指向字符 串的指针数组。 由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main 函数的形参呢? 实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时, 在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。DOS提示符下命令行 的一般形式为: C:>可执行文件名 参数 参数……; 但是应该特别注意的是,main 的两个形参和命令行中的参数在 位置上不是一一对 应的。 argc: 参数表示命令行中参数的个数(注意 文本名本身也是一个参数),rgc的值是在输入命令行时由系统按 实际参数的个数自动赋予的。 rwx ‐> 7 read, write , excute ssize_twrite (int fd,const void * buf, size_t count); ssize_tread(int fd,void * buf, size_tcount); int main(int argc,char *argv[]) { return 0; } 文件描述符 缩写 描述 0 STDIO 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误输出 argv :参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组 的长度即为参数个数。数组元素初值由系统自动赋予。

实现CP指令 src 源文件 des 目标文件 执行流程: 打开源文件(src)open 打开目标文件(des) open 写入目标文件 write 读取src文件到缓存数组 read 关闭目标文件和源文件 close ./a.out src.c des.c

#include <sys/types.h>
  2 #include <sys/stat.h>
  3 #include <fcntl.h>
  4 #include <stdio.h>
  5 #include <unistd.h>
  6 #include <string.h>
  7 #include <unistd.h>
  8 
  9 //ssize_t read(int fd, void *buf, size_t count);
 10 //ssize_t write(int fd, const void *buf, size_t count);
 11 
 12 // int open(const char *pathname, int flags);
 13 // int open(const char *pathname, int flags, mode_t mode);
 14 
 15 int main()
 16 {
 17     int fd;
 18     char writebuff[128] = {0};
 19     char *test = "hello world";
 20     char readbuff[11]={0};
 21     strcpy(writebuff,test);
 22 
 23     fd = open("mm",O_RDWR|O_CREAT , 0755);
 24     if(fd == -1)
 25    {
 26       printf("open mm failed\n");
 27       return -1;
 28    }
 29      printf("open success\n");
 30 //     int len = write(fd, &writebuff[0], 11);
 31 
 32 //    if(len == -1)
 33   //      printf("write failed\n");
 34      read(fd,&readbuff[0],12);
 35      printf("read value is : %s\n",readbuff);
 36      close(fd);
 37     return 0;
 38 }

5.lseek函数

off_t lseek(int fd, off_t offset, int whence);光标的偏移量

fd : 文件描述符

Offset :偏移量

Whence :

SEEK_SET: 参数offset即为新的读写位置

SEEK_CUR: 以目前的读写位置往后增加offset个偏移量

SEEK_END: 将读写位置指向文件尾后再增加offset个位移量,当whence值为

SEEK_CUR或SEEK_END时, 参数offset允许负值的出现。

返回值: 文件读写距离文件开头的字节大小,出错返回 -1

#include <stdio.h>
 #include <unistd.h>
 #include <unistd.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>






int main(int argc, char *argv[])
{
      int src_fd;
      int des_fd;

      char readBuff[1024] = {0};
      int n_Ret = 0;
     
      if (argc != 3 )
      {
          printf("error\n");
          return -1;
      }

      src_fd = open(argv[1],O_RDWR);
      
       n_Ret = read(src_fd,&readBuff[0],1024);

      des_fd = open(argv[2],O_RDWR|O_CREAT,0755);
   
      write(des_fd,readBuff,n_Ret);

      close(src_fd);
      close(des_fd);



      return 0;

}

7.fopen函数

fopen 在用户态是缓存的 open 在用户态是没有缓存的

FILE * fopen(constchar *path , cost char *mode)
/*
* @description : 打开一个文件
* @param ‐ path : 指定文件路径,如:"./test.txt"
* @param ‐ mode :指定文件的打开方式,如下图:
* @return : 成功,返回指向该文件的文件指针; 若失败,返回 NULL
*/
注:mode有以下值:
r:只读方式打开,文件必须存在
r+:可读写,文件必须存在
rb+:打开二进制文件,可以读写
rt+:打开文本文件,可读写
w:只写,文件存在则文件长度清0,文件不存在则建立该文件
w+:可读写,文件存在则文件长度清0,文件不存在则建立该文件
a:附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾,EOF符保留
a+:附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾,EOF符不保留
wb:打开二进制文件,只写 wb+:打开或建立二进制文件,可读写
wt+:打开或建立文本文件,可读写
at+:打开文本文件,可读写,写的数据加在文本末尾 ab+:打开二进制文件,可读写,写的数据加在文件末

8.fread函数

size_t fread(void*buff , size_t size, size_t count , FILE* stream)
/
* @description :对已打开的流进行数据读取
* @param ‐ ptr :指向 数据块的指针
* @param ‐ size :指定读取的每个数据项的字节数
* @param ‐ nmemb : 指定要读取的数据项的个数
* @param ‐ stream :要读取的文件流
* @return : 返回实际读取数据项的个数;
*/

参数: 第一个参数为接收数据的指针(buff),也即数据存储的地址 第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节 第三个参数为元素个数,即要读取的数据大小为size的元素个素 第四个参数为提供数据的文件指针,该指针指向文件内部数据 返回值:读取的总数据元素个数

int fread(void *buffer,intsize,intcount,FILE*fp)
void *memset(void*buffer, int c, int count)
buffer:为指针或是数组
c:是赋给buffer的值
count:是buffer的长度
memset(void*buff,0,sizeof(buff)); 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘’或‘/0’;

9.fwrite函数

int fwrite(void*buffer,intsize,intcount,FILE*fp)
/*
* @description :对已打开的流进行写入数据块
* @param ‐ ptr :指向 数据块的指针
* @param ‐ size :指定写入的每个数据项的字节数,如调用sizeof(char)
* @param ‐ nmemb :指定写入的数据项的个数
* @param ‐ stream :要写入的文件流
* @return : 返回实际写入的数据项的个数
*/

fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放 到从buffer开始的内存中; buffer是存放读入数据的起始地址(即存放何处)。 fwrite()──从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件 中。buffer是要输出数据在 内存中的起始地址(即从何处开始输出)。 一般用于二进制文件的处理。10.fseek函数

int fseek(FILE *stream,long offset,int framewhere)

参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置 返回值:重定位成功返回0,否则返回非零值 需要注意的是该函数不是重定位文件指针,而是重定位文件内部的指针,让指向文件内部数据的指针移到文件中我 们感兴趣的数据上,重定位主要是这个目的。 说明:执行成功,则stream指向以fromwhere为基准,偏移offset个字节的位置。执行失败(比方说offset偏移的位 置超出了文件大小),则保留原来stream的位置不变 分别用3个宏 SEEK_SET 既0 文件开头 SEEK_CUR 既1 文件当前位置 SEEK_END 既2 文件结尾 但不推荐用数字 最好用宏 简言之: 1. fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处; 2. fseek(fp,100L,SEEK_CUR);把fp指针移动到离文件当前位置100字节处; 3. fseek(fp,100L,SEEK_END);把fp指针退回到离文件结尾100字节处。

11.fclose函数

/*
* @description :关闭一个已打开的流
* @param ‐ stream :文件指针(流)
* @return : 成功,返回0; 若失败,返回EOF
*/
1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main()
  5 {
  6    FILE *fp = NULL;
  7    int nRet = 0;
  8    char readBuff[12];
  9    char *writeBuff = "hello world";
 10 
 11    fp = fopen("mm","r+");
 12    if(fp == NULL)
 13    {
 14     printf("open failed\n");
 15     return -1 ;
 16    }
 17     printf("open success\n");
 18 
 19     nRet = fread(readBuff,4,2,fp);
 20     if(nRet <= 0)
 21     {
 22       printf("read failed\n");
 23       return -2;
 24     }
 25      printf("read success\n");
 26 
 27     nRet = fwrite(writeBuff,4,1,fp);
 28     if(nRet <= 0)
 29      {
 30       printf("fwrite failed!\n");
 31 
 32      }
 33 
 34    return 0;
 35 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值