目录
1、man 手册
1.1 汉化
1.2 具体使用
2、文件权限
2.1 权限理解
2.2 文件详细信息查询
2.3 权限更改
3、常用函数接口
3.1 open
3.2 read
3.3 write
3.4 close
3.5 函数使用示例
4、make与Makefile
4.1 make 与 Makefile区别
4.2 Makefile的编写
5、vim简单操作
1、man 手册
1.1 汉化
安装中文包
sudo apt-get update
sudo apt-get install manpages-zh
1.2 具体使用
使用三种方式查询open接口的详细信息
//man -L zh_CN open
man 1 open
man 2 open
man 3 open
2、文件权限
2.1 权限理解
在 Ubuntu(以及其他类 UNIX 操作系统)中,文件权限用于控制谁可以对文件进行哪些操作。文件权限在权限位组合中表示为一组三位权限字符串。每个权限字符串表示了文件的所有者、组和其他用户所具有的权限。 Ubuntu 文件权限的详细说明:
一个权限字符串由九个字符组成,这九个字符可以分成三组,每组三个字符:
- 第一组:文件类型和所有者权限
- 第二组:组权限
- 第三组:其他用户权限
每组中的三个字符分别表示读取(r)、写入(w)和执行(x)权限。如果某个权限位被授予,相应的字符为相应的字母,如果未授予,则为减号(-)。
以下是一个权限字符串的示例:-rwxr--r--
这个权限字符串表示:
- 文件类型:普通文件(减号表示)
- 所有者权限:读、写、执行
- 组权限:读
- 其他用户权限:读
2.2 文件详细信息查询
可以用 ll 命令查看当前文件夹下文件详细信息
或者查看指定文件
zsd@Ubuntu:~/study/linuxStudy$ ls -l test.c
-rw-rw-r-- 1 zsd zsd 0 8月 27 15:34 test.c
在上面的输出中,-rw-r--r--
就是文件的权限字符串。第一个字符 - 表示文件类型(普通文件),d 表示隐藏文件,接下来的三个字符是所有者权限,再后面的三个字符是组权限,最后的三个字符是其他用户权限。
2.3 权限更改
要更改文件权限,可以使用 chmod
命令。例如,要将文件 "test.c" 的所有者权限设置为读、写、执行,可以执行以下命令:
chmod 700 test.c
这会将权限字符串修改为 -rwx------
,表示所有者拥有全部权限,其他用户没有任何权限。
3、常用函数接口
3.1 open
open
函数是一个系统调用,用于打开一个文件或者创建一个新文件,并返回一个文件描述符(file descriptor),以便后续对文件的读写操作。它是在 <fcntl.h>
头文件中声明的,其函数原型如下:
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
① open
函数的参数和作用:
-
pathname
(文件路径):这是一个字符串,表示要打开或创建的文件的路径。可以是相对路径或绝对路径。 -
flags
(标志位):这是一个整数,用于指定打开文件的方式和选项。常见的标志位包括:O_RDONLY
:只读打开。O_WRONLY
:只写打开。O_RDWR
:读写打开。O_CREAT
:如果文件不存在,创建文件。O_TRUNC
:如果文件存在,截断文件(将文件大小置为0)。O_APPEND
:在文件末尾追加写入。
这些标志位可以通过按位或(
|
)组合使用,以满足特定的需求。例如,O_RDONLY | O_CREAT
表示以只读方式打开文件,如果文件不存在则创建。 -
mode
(文件权限):这是一个整数,仅在创建文件时使用。它指定了新创建文件的权限(文件所有者、组和其他用户的读写执行权限)。通常使用八进制表示,如0644
表示所有者可读写,其他用户只读。
②函数返回值:
open
函数的返回值是一个整数,表示文件描述符。如果成功打开或创建文件,返回的文件描述符是一个非负整数。如果出现错误,返回值为 -1,并可以使用 errno
来获取具体的错误代码。
3.2 read
read
函数是一个系统调用,用于从文件描述符(file descriptor)中读取数据。它是在 <unistd.h>
头文件中声明的,其函数原型如下:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
①read 函数的参数和作用:
-
fd
(文件描述符):这是一个整数值,表示要从哪个文件描述符读取数据。文件描述符是一个用于标识打开的文件、套接字等的整数值。在代码中,使用了open
函数来打开文件,并将返回的文件描述符传递给了read
函数。 -
buf
(缓冲区):这是一个指向存储读取数据的内存缓冲区的指针。read
函数会将读取的数据存储到这个缓冲区中。 -
count
(读取字节数):这是要读取的最大字节数。read
函数会尝试从文件中读取最多count
字节的数据。
②函数返回值:
read
函数的返回值是一个 ssize_t
类型的整数,表示实际读取的字节数。返回值可以是以下几种情况之一:
- 如果返回值为正数:表示成功读取了指定数量的字节。
- 如果返回值为 0:表示已经到达文件末尾(End of File,EOF)。
- 如果返回值为 -1:表示出现了错误。可以通过检查
errno
来获取具体的错误代码。
3.3 write
write
函数是一个系统调用,用于向文件描述符(file descriptor)写入数据。它是在 <unistd.h>
头文件中声明的,其函数原型如下:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
①write
函数的参数和作用:
-
fd
(文件描述符):这是一个整数值,表示要向哪个文件描述符写入数据。文件描述符是一个用于标识打开的文件、套接字等的整数值。在代码中,你使用了open
函数来打开文件,并将返回的文件描述符传递给了write
函数。 -
buf
(缓冲区):这是一个指向包含要写入数据的内存缓冲区的指针。write
函数会将缓冲区中的数据写入到文件中。 -
count
(写入字节数):这是要写入的字节数。write
函数会尝试将缓冲区中的前count
字节的数据写入到文件中。
②函数返回值:
write
函数的返回值是一个 ssize_t
类型的整数,表示实际写入的字节数。返回值可以是以下几种情况之一:
- 如果返回值为非负数:表示成功写入了指定数量的字节。
- 如果返回值为 -1:表示出现了错误。可以通过检查
errno
来获取具体的错误代码。
3.4 close
close
函数是一个系统调用,用于关闭文件描述符(file descriptor)。它是在 <unistd.h>
头文件中声明的,其函数原型如下:
#include <unistd.h>
int close(int fd);
①close
函数的解析:
fd
(文件描述符):这是一个整数值,表示要关闭的文件描述符。文件描述符是一个用于标识打开的文件、套接字等的整数值。在代码中,你可能使用了open
函数来打开文件,并将返回的文件描述符传递给了close
函数。
②函数返回值:
close
函数的返回值是一个整数。如果关闭文件成功,返回值为 0。如果出现错误,返回值为 -1,并可以通过检查 errno
来获取具体的错误代码。
3.5 函数使用示例
#include <fcntl.h> // 包含文件操作相关的头文件
#include <unistd.h> // 包含系统调用相关的头文件
#include <stdio.h> // 包含标准输入输出库,用于使用 perror 函数
int main() {
// 打开源文件,只读方式
int src_fd = open("source.txt", O_RDONLY);
if (src_fd == -1) {
perror("Error opening source file");
return 1;
}
// 打开目标文件,写入方式(如果不存在则创建)
int dest_fd = open("destination.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (dest_fd == -1) {
perror("Error opening destination file");
close(src_fd); // 关闭源文件
return 1;
}
// 读取源文件数据并写入目标文件
char buffer[1024];
ssize_t bytes_read;
while ((bytes_read = read(src_fd, buffer, sizeof(buffer))) > 0) {
ssize_t bytes_written = write(dest_fd, buffer, bytes_read);
if (bytes_written == -1) {
perror("Error writing to destination file");
close(src_fd); // 关闭源文件
close(dest_fd); // 关闭目标文件
return 1;
}
}
// 检查读取过程中是否出错
if (bytes_read == -1) {
perror("Error reading from source file");
close(src_fd); // 关闭源文件
close(dest_fd); // 关闭目标文件
return 1;
}
// 关闭文件
if (close(src_fd) == -1) {
perror("Error closing source file");
return 1;
}
if (close(dest_fd) == -1) {
perror("Error closing destination file");
return 1;
}
printf("File copy successful.\n");
return 0;
}
4、make与Makefile
4.1 make 与 Makefile区别
make
: make
是一个命令行工具,用于自动化构建软件项目。它根据一组规则和依赖关系,检查源代码文件的最新修改日期,并确定哪些文件需要重新编译。make
在 Linux 和类 UNIX 系统上广泛使用,以减少手动编译的工作量。
Makefile
: Makefile
是一个文本文件,其中包含了用于构建软件项目的规则、依赖关系和命令。它告诉 make
工具如何编译和链接源代码文件,以及在构建过程中需要执行哪些操作。Makefile
通常包括目标(target)、依赖关系(dependencies)和要执行的命令。
4.2 Makefile的编写
# 编译器
# CC = g++
CC = gcc
# 编译选项
# CFLAGS = -Wall -std=c++11
# CFLAGS = -Wall -std=c++11 -g
# CFLAGS = -Wall -std=c++11 -static
CFLAGS = -Wall
# 目标文件名
TARGET = myprogram
# 所有的源代码文件
SOURCES = main.c utils.c mytest.c
# 生成目标文件的中间文件
OBJECTS = $(SOURCES:.c=.o)
# 默认目标
all: $(TARGET)
# 生成目标文件
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS)
# 编译每个源文件到目标文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 调试目标
# debug: $(TARGET)
# gdb ./$(TARGET)
# 清理生成的文件
clean:
rm -f $(OBJECTS) $(TARGET)
5、vim简单操作
输入:help查看帮助,按下Ctrl
+ w 然后按下 q 退出帮助
-
启动 Vim: 在终端中输入
vim
命令,后跟文件名,即可启动 Vim 并打开指定文件: -
模态编辑: Vim 有多种模式,其中两个主要模式是:
- 正常模式(Normal Mode):用于导航、删除、复制等操作。
- 插入模式(Insert Mode):用于输入文本。
-
切换模式:
- 进入正常模式:按下
Esc
键。 - 进入插入模式:在正常模式下按下
i
键(在光标前插入)、a
键(在光标后插入)或其他命令(如o
或O
)。
- 进入正常模式:按下
-
保存和退出:
- 保存文件:在正常模式下按下
:
键,然后输入w
并按下Enter
键。 - 保存并退出:在正常模式下按下
:
键,然后输入wq
并按下Enter
键。 - 退出不保存:在正常模式下按下
:
键,然后输入q!
并按下Enter
键。
- 保存文件:在正常模式下按下
-
基本移动:
- 上移:
k
- 下移:
j
- 左移:
h
- 右移:
l
- 上移:
-
删除和复制:
- 删除字符:在正常模式下按下
x
键。 - 复制行:在正常模式下按下
yy
。
- 删除字符:在正常模式下按下
-
撤销和重做:
- 撤销:在正常模式下按下
u
键。 - 重做:在正常模式下按下
Ctrl
+r
键。
- 撤销:在正常模式下按下
-
查找和替换:
- 查找:在正常模式下按下
/
键,然后输入要查找的内容并按下Enter
键。 - 替换:在正常模式下按下
:
键,然后输入%s/old/new/g
进行全局替换。
- 查找:在正常模式下按下