Linux系统笔记(ubuntu)

shell命令集

1、当前路径显示命令pwd

pwd: 查看当前目录

2、目录信息查看命令ls

ls :查看当前目录下的文件
ls -a :查看当前目录下的所有文件(包含以. 开头的文件)
ls -l: 查看文件详细信息(权限、创建时间 、文件大小)

3、目录切换命令cd

cd : 回到根目录
cd -: 回到上一次跳转目录
cd 路径: 跳转到指定路径
cd …: 返回上一级目录
cd …/…: 返回上上级目录

4、显示文件内容命令cat

5、系统信息查看命令uname

6、清理屏幕命令clear

7、查找文件命令find

8、切换用户身份命令sudo

9、文件拷贝命令cp

10、切换用户命令su

11、移动文件命令mv

12、创建文件夹命令mkdir

13、创建文件命令touch

14、删除命令rm

15、目录删除命令rmdir

16、显示网络配置信息命令ifconfig

17、重启命令reboot

18、关机命令poweroff

19、系统帮助命令man

20、数据同步写入磁盘命令sync

21、查找内容命令grep

22、文件夹大小查看命令du

23、磁盘空间检查命令df

24、使用gedit编辑器gedit

25、当前的系统进程查看命令ps

26、进程实时运行状态查看命令top

27、文件类型查看命令file

ubuntu文件系统

一、根目录“/”

Linux下“/”就是根目录!所有的目录都是由根目录衍生出来的。

二、Ubuntu文件系统结构

/bin 存放二进制可执行文件,这些命令在单用户模式下也 能够使用。可以被root和一般的账号使用。

/boot Ubuntu内核和启动文件,比如vmlinuz-xxx。gurb引导装载程序。

/dev 设备驱动文件

/etc 存放一些系统配置文件,比如用户账号和密码文件,各种服务的起始地址。

/home 系统默认的用户主文件夹,一般创建用户账户的时候,默认的用户主文件夹都会放到此目录下。

/lib 存放库文件

/media 此目录下放置可插拔设备,比如SD卡,或者U盘就是挂载到这个目录中。

/mnt 用户可使用的挂载点,如果要挂载一些额外的设备,那么就可以挂载到此处。

/opt 可选的文件和程序存放目录,给第三方软件放置的目录。

/root root用户目录,也就是系统管理员目录。

/sbin 和/bin类似,也是存放一些二进制可执行文件。sbin下面的一般是系统开机过程中所需要的命令。

/srv 服务相关目录。比如网络服务。

/sys 记录内核信息,虚拟文件系统。

/tmp 临时目录

/var 存放一些变化的文件,比如日志文件

/usr usr不是user的缩写,而是UNIX Software Resource的缩写,存放于系统用户有关的文件,会占用很大的存储空间!

/proc 虚拟文件系统,数据放置到内存中,存放系统运行信息

三、绝对路径和相对路径
绝对路径:从根目录“/”算起的路径。

相对路径:相对于目前路径的文件名写法,比如./home/zzk。不是以“/”开头的就行。
. ” 代表当前路径,也可以 用“./”表示
. . ”代表上一层目录,也可以用“…/”表示

vi编辑器

一、vi/vim的三种模式

vi编辑器有三种模式:
命令模式(command mode)、
插入模式(Insert mode)、
底行模式(last line mode)。

在命令模式下:输入的字母i,切换插入模式
在插入模式下:点击Esc退出,进入命令模式
在命令模式下:输入:(英文冒号),进入底行模式

插入模式和底行模式不能直接切换,要经由命令模式。

进入底行模式,底部会出现冒号提示:进入插入模式,底部会出现–INSERT–提示。

文件IO

1、Linux文件IO接口(API)

open: 打开文件

int open(char *pathname,int flags);
int open(char *pathname,int flagsmode_t mode);

参数:
pathname:文件路径,例如:"./a.txt"
flags:打开指定文件后的权限,分为主类和副类
mode:如果文件被新建,指定其权限位(八进制码)
返回:返回文件句柄

flag主类:

O_RDONLY OWRONLY O_RDWR
只读 只写 可读可写

flag副类

O_EXCL 如果文件存在,则返回错误消息
O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端
O_TRUNC 如果文件已经存在则清除文件中的原有内容
O_APPEND 若写文件则在文件内容后追加内容

read: 读文件

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

参数:
fd:表示要读取的文件句柄,一般由前面的open返回得到。(用来标识不同文件)
buf:是应用程序自己提供的一段内存缓冲区,用来存储读出的内容。
count:是要读取的字节数。返回值ssize_t类型是linux内核用typedef重定义的一个类型(其实就是int),表示成功读取的字节数。
返回:成功返回读字节数,失败返回-1

write: 写文件

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

参数:
fd:表示要写的文件句柄,一般由前面的open返回得到。
buf:要写的内容
count:要写的字节数。
返回:成功返回写入字节,失败返回-1

close:关闭文件

 int close(int fd);

参数:
fd:表示要关闭的文件句柄

打开文件示例代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
   
#define READ_SIZE 20
char *pathname = "./a.txt";     //定义文件路径名
char read_buff[READ_SIZE];          //读取存放数组
 
int main(int argc,char *argv[])
{
 	int fd = -1;                //打开状态标志
	int ret = 0;                //读文件状态标志
 
    fd = open(pathname,O_RDONLY); //打开一个文件/只读
    if(fd == -1)
    {
        printf("open error!\n");//如果打开失败输出提示
        exit(-1);               //退出程序
    }
    ret = read(fd,read_buff,READ_SIZE);//读取文件内容到数组read_buff
    if(ret < 0)
    {
        printf("read error!\n");//读取失败处理
    }
    else                        //读取成功处理
    {
        printf("read success!\n");
        printf("ret = %d,fd = %d,constent is [%s]\n",ret,fd,read_buff);//输出读取数组
    }
     return 0;
  }

Linux中C库mmap()函数详解

  void *mmap(void *start, size_t length,
  int prot,int flags, int fd, off_t offset);  

系统调用mmap()用于共享内存

int munmap( void * addr, size_t len )

该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小。当映射关系解除后,对原来映射地址的访问将导致段错误发生。

 int msync ( void * addr , size_t len, int flags)

一般说来,进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用munmap()后才执行该操作。可以通过调用msync()实现磁盘上文件内容与共享内存区的内容一致。

参数:
start: 映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。

length: 映射区的长度。

prot: 期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算(“|”)合理地组合在一起

  PROT_EXEC //页内容可以被执行
  PROT_READ //页内容可以被读取
  PROT_WRITE //页可以被写入
  PROT_NONE //页不可访问

flags: 指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体

  MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。
     //并且起始地址必须落在页的边界上。
  MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
  MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
  MAP_DENYWRITE //这个标志被忽略。
  MAP_EXECUTABLE //同上
  MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。
  MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。
  MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。
  MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。
  MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。
  MAP_FILE //兼容标志,被忽略。
  MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。
  MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。
  MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。

fd: 有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射。

offset: 被映射对象内容的起点。

函数返回值:
成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED[其值为(void *)-1],munmap返回-1。
errno被设为以下的某个值:

  EACCES:访问出错
  EAGAIN:文件已被锁定,或者太多的内存已被锁定
  EBADF:fd不是有效的文件描述词
  EINVAL:一个或者多个参数无效
  ENFILE:已达到系统对打开文件的限制
  ENODEV:指定文件所在的文件系统不支持内存映射
  ENOMEM:内存不足,或者进程已超出最大内存映射数量
  EPERM:权能不足,操作不允许
  ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志
  SIGSEGV:试着向只读区写入
  SIGBUS:试着访问不属于进程的内存区

系统调用mmap()用于共享内存的方式:
使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下:

   fd=open(name, flag, mode); 
   if(fd<0) 
   ... 
   ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0);

程序示例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define LCD_SIZE 800*480*4
//主函数
int main(void)
{
	//找到并打开lcd设备文件
	int lcd_fd = open("/dev/ubuntu_lcd",O_RDWR);
	//判断打开成功否
	if(lcd_fd == -1)//失败
	{
		perror("打开ubuntu_lcd失败");
		exit(-1);
	}
	
	/*开启映射*/
	char *map_ptr = mmap(NULL, LCD_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);//void *的指针可以转换为任意型
	//检测是否映射成功
	if(map_ptr == MAP_FAILED)
	{
		perror("映射失败");
		exit(-1);
	}
	/*解除映射*/
	munmap(map_ptr, LCD_SIZE);
	
	return 0;
}

bmp图片格式详解

BMP图片格式
Bmp图片格式组成部分:bmp文件头(14 bytes) + 位图信息头(40 bytes) + 调色板(由颜色索引数决定) + 位图数据(由图像尺寸决定)

程序实例:

typedef struct {			//bmp图片文件头信息封装 
	// 位图文件头 14bytes
	u8  bit_file_type[2];	//位图文件类型:'BM'->0x4d42 
	u32 file_size;	  		//整个文件大小 
	u16 reserved1;	  		//保留 
	u16 reserved2;	  		//保留 
	u32 offset;		  		//文件头到位图数据之间的偏移量 

	// 位图信息头 40 bytes
	u32 head_size;			//位图信息头长度 
	u32 width;		  		//位图宽度 
	u32 height;		  		//位图高度 
	u16 bit_planes;	  		//位图位面数 
	u16 bits_per_pixel; 	//每个像素的位数 
	u32 compression;		//压缩说明 
	u32 image_size;			//位图数据大小 
	u32 h_res;				//水平分辨率 
	u32 v_res;				//垂直分辨率 
	u32 color_palette;		//位图使用的颜色索引数 
	u32 vip_color;			//重要的颜色索引数目 

}bmp_head;

线程

pthread_create函数 创建一个新线程。 其作用,对应进程中fork() 函数。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

返回值:成功:0; 失败:错误号 -----Linux环境下,所有线程特点,失败均直接返回错误号。
参数:

pthread_t:当前Linux中可理解为:typedef unsigned long int pthread_t;
参数1:传出参数,保存系统为我们分配好的线程ID
参数2:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
参数3:函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。
参数4:线程主函数执行期间所使用的参数,如要传多个参数, 可以用结构封装。

#include <pthread.h>//线程头文件
#include <unistd.h>//sleep()头文件
#include <stdio.h>
//线程执行函数
void *fun(void *arg)
{
	while(1)
	{
		printf("this is pthread!\n");
		sleep(1);
	}
}

int main(void)
{
    pthread_t p_id;//创建线程
	pthread_create(&p_id,NULL,fun,NULL);
	while(1)
	{
		printf("this is main!\n");
		sleep(1);
	}
}

编译命令必须加-lpthread,链接线程库
gcc text.c -lpthread
会自动生成a.out可执行文件
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mbs520/article/details/104814943