目录
[使用 & 符号](#使用 & 符号)
[使用 nohup 命令](#使用 nohup 命令)
[使用 screen 或 tmux](#使用 screen 或 tmux)
[grep 命令](#grep 命令)
[如何使用 vim 直接定位到错误行](#如何使用 vim 直接定位到错误行)
[1. 使用 :make 和 :copen](#1. 使用 :make 和 :copen)
[2. 使用 :lineno 定位](#2. 使用 :lineno 定位)
[3. 通过 :grep 或 :vimgrep](#3. 通过 :grep 或 :vimgrep)
[4. 错误标记和高亮](#4. 错误标记和高亮)
[5. 自动跳转(插件)](#5. 自动跳转(插件))
[6.进入到 vim 后,:行号](#6.进入到 vim 后,:行号)
[7. vim 文件名 +行号](#7. vim 文件名 +行号)
[利用 find 和 grep 组合实现查找某个目录下包含指定字符串的文件](#利用 find 和 grep 组合实现查找某个目录下包含指定字符串的文件)
[gdb 主函数传参 3 种方式](#gdb 主函数传参 3 种方式)
[(1) 在命令行中传递参数](#(1) 在命令行中传递参数)
[(2) 使用 set args 命令传递参数](#(2) 使用 set args 命令传递参数)
[(3) 在程序启动时通过环境变量传递](#(3) 在程序启动时通过环境变量传递)
[如何在 makefile 文件中做 echo 提示且不显示执行指令](#如何在 makefile 文件中做 echo 提示且不显示执行指令)
[SOURCES := (wildcard (patsubst %,%/*.c, (SOURCEDIRS)))](#SOURCES := (wildcard (patsubst %,%/*.c, (SOURCEDIRS))))
[1. (SOURCEDIRS)](#1. (SOURCEDIRS))
[2. (patsubst %,%/\*.c, (SOURCEDIRS))](#2. (patsubst %,%/*.c, (SOURCEDIRS)))
[3. (wildcard ...)](#3. (wildcard ...))
[4. 综合结果](#4. 综合结果)
[lstat 判断文件权限用的宏](#lstat 判断文件权限用的宏)
[1. lstat 函数](#1. lstat 函数)
[2. st_mode 字段和文件权限](#2. st_mode 字段和文件权限)
[3. 判断文件权限的宏](#3. 判断文件权限的宏)
[4. 示例代码:如何使用 lstat 判断文件权限](#4. 示例代码:如何使用 lstat 判断文件权限)
[5. 解释](#5. 解释)
[6. 结果示例](#6. 结果示例)
扩展
查找如何进行后台运行程序的指令
在 Linux 或 Unix 系统中,可以通过以下几种方式让程序在后台运行:
使用 &
符号
-
语法 :
command &
-
说明 :在命令后面加上
&
,可以让程序在后台运行。例如:sleep 100 &
这会启动一个
sleep
命令,让它在后台运行100秒。
使用 nohup
命令
-
语法 :
nohup command &
-
说明 :
nohup
是一个用于在用户注销后继续运行命令的工具。它会将程序的输出重定向到nohup.out
文件中。例如:nohup python myscript.py &
这会运行一个 Python 脚本,并将其输出保存到
nohup.out
文件中,同时让程序在后台运行。
使用 screen
或 tmux
-
screen
-
启动 :
screen -S session_name
(创建一个名为session_name
的会话) -
进入后台 :在
screen
会话中按Ctrl+A
,然后按D
键,会话会进入后台。 -
重新连接 :
screen -r session_name
(重新连接到后台的会话)
-
-
tmux
-
启动 :
tmux new -s session_name
(创建一个名为session_name
的会话) -
进入后台 :在
tmux
会话中按Ctrl+B
,然后按D
键,会话会进入后台。 -
重新连接 :
tmux attach -t session_name
(重新连接到后台的会话)
-
find命令
find
是一个强大的命令行工具,用于在文件系统中查找文件和目录。
基本语法
find [路径] [选项] [表达式]
常用选项
-
-name
:按文件名查找find . -name "*.txt" # 查找当前目录及其子目录下所有扩展名为.txt的文件
-
-type
:按文件类型查找-
f
:普通文件 -
d
:目录 -
l
:链接find . -type d -name "bin" # 查找当前目录及其子目录下所有名为bin的目录
-
-
-mtime
:按修改时间查找find . -mtime +7 # 查找7天前修改的文件
-
-size
:按文件大小查找find . -size +10M # 查找大于10MB的文件
grep
命令
grep
是一个用于搜索文本内容的工具,可以在文件中查找匹配特定模式的行。
基本语法
grep [选项] 模式 文件
常用选项
-
-i
:忽略大小写grep -i "hello" file.txt # 在file.txt中查找包含"hello"的行,忽略大小写
-
-r
或-R
:递归搜索grep -r "hello" . # 在当前目录及其子目录中递归查找包含"hello"的行
-
-v
:反向匹配grep -v "hello" file.txt # 在file.txt中查找不包含"hello"的行
-
-n
:显示行号grep -n "hello" file.txt # 在file.txt中查找包含"hello"的行,并显示行号
-
-w
:匹配整词grep -w "hello" file.txt # 在file.txt中查找整词"hello"的行
如何使用 vim 直接定位到错误行
1. 使用 :make
和 :copen
如果你在 Vim 中编译代码并且遇到错误,通常你会使用 :make
命令来进行编译。编译过程中,Vim 会生成一个错误列表,通常显示在 quickfix 窗口中。你可以通过以下步骤直接定位到错误行:
- 运行编译命令 :例如
:make
,它会调用你配置的编译器(如gcc
)进行编译,错误信息会被捕捉到 quickfix 列表中。 - 打开 quickfix 窗口 :运行
:copen
,这会打开一个窗口,显示所有编译错误。 - 跳转到特定错误 :在 quickfix 窗口中,使用
:cnext
跳转到下一个错误,使用:cprev
跳转到上一个错误,或者使用:cc <number>
跳转到指定的错误。
2. 使用 :lineno
定位
如果你已经知道错误所在的行号,你可以使用 :linenumber
直接跳转到该行。例如:
:15
这将会跳转到第 15 行。
3. 通过 :grep
或 :vimgrep
如果你要查找某个关键字或错误信息,可以使用 :grep
或 :vimgrep
来搜索并定位到相关行。例如:
:vimgrep /error/ *.c
这会在当前目录下的所有 .c
文件中搜索包含 "error" 的行,然后你可以通过 :copen
查看错误列表并跳转。
4. 错误标记和高亮
当你打开代码后,你可以使用 :set errorformat
配置错误格式,以便能够更好地解析编译器输出的错误信息。
5. 自动跳转(插件)
如果你经常需要定位错误行,也可以使用一些插件,比如 Ale 或 Syntastic ,这些插件会自动扫描文件并在你编写代码时实时显示错误信息,你只需按下快捷键(如 ]e
或 [e
)即可直接跳转到错误行。
6.进入到 vim 后,:行号
7. vim 文件名 +行号
使用/字符串查找完之后,如何取消高亮
:noh
利用 find 和 grep 组合实现查找某个目录下包含指定字符串的文件
可以使用 find
命令来查找目录下的文件,然后使用 grep
来查找包含指定字符串的文件。组合命令如下:
find /path/to/dir -type f -exec grep -l "search_string" {} \;
/path/to/dir
:你要查找的目录。-type f
:仅查找文件。-exec grep -l "search_string" {} \;
:对于每个找到的文件,执行grep
命令查找包含search_string
的文件,并且-l
选项使得grep
输出匹配该字符串的文件名。
这将列出所有包含指定字符串的文件。
如果你想让 grep
支持递归查找文件,可以直接使用 grep
的 -r
选项来查找:
grep -rl "search_string" /path/to/dir
gdb 主函数传参 3 种方式
(1) 在命令行中传递参数
可以在启动 GDB 时通过 --args
参数传递命令行参数:
gdb --args ./your_program arg1 arg2 arg3
然后,使用 run
命令启动调试,会将 arg1
, arg2
, arg3
传递给主函数。
(2) 使用 set args
命令传递参数
在 GDB 会话中,可以通过 set args
命令设置主函数的命令行参数:
(gdb) set args arg1 arg2 arg3
(gdb) run
这将把 arg1
, arg2
, arg3
作为参数传递给主函数。
(3) 在程序启动时通过环境变量传递
通过环境变量传递参数也是一种方式,虽然不常见,但可以在某些情况下使用。在 GDB 中,可以使用 set environment
命令来设置环境变量:
(gdb) set environment VAR=value
但要注意,主函数的 argc
和 argv
是通过命令行参数传递的,环境变量方式一般用于设置特定的程序行为。
如何在 makefile 文件中做 echo 提示且不显示执行指令
在 Makefile
中,想要做一个 echo
提示,但不显示执行指令,你可以使用 @
符号来禁止显示当前命令。示例如下:
all:
@echo "This is a message without showing the command"
@
符号可以让make
在执行时不显示该命令本身,只显示echo
输出的内容。
如果你不加 @
,make
会显示执行的命令行:
all:
echo "This is a message with the command visible"
这样会在终端显示 echo
命令以及其输出。
SOURCES := (wildcard (patsubst %,%/*.c, $(SOURCEDIRS)))
这行代码使用了 Makefile
中的 wildcard
函数和 patsubst
函数,来动态获取文件路径。具体来说,它的作用是根据给定的 SOURCEDIRS
变量中的目录列表,查找这些目录下的所有 .c
文件,并将这些文件的路径存储到 SOURCES
变量中。
逐步分析这个表达式:
SOURCES := $(wildcard $(patsubst %,%/*.c, $(SOURCEDIRS)))
1. $(SOURCEDIRS)
SOURCEDIRS
是一个包含目录路径的变量,可能是类似这样的列表:
SOURCEDIRS := src lib
这个变量包含了多个目录路径(比如 src
和 lib
)。
2. $(patsubst %,%/*.c, $(SOURCEDIRS))
patsubst
是 Makefile
中的一个函数,用于模式替换。它的语法是:
$(patsubst pattern,replacement,text)
它会将 text
中所有匹配 pattern
的部分替换为 replacement
。
pattern
:匹配的模式,这里是%
,代表任意字符串。replacement
:替换成的内容,这里是/%/*.c
,表示每个目录后面加上/*.c
,以匹配该目录下的.c
文件。text
:要进行替换的字符串,这里是$(SOURCEDIRS)
,即包含目录路径的列表。
举个例子,如果 SOURCEDIRS
包含 src
和 lib
,那么:
$(patsubst %,%/*.c, $(SOURCEDIRS))
会将 src
替换为 src/*.c
,将 lib
替换为 lib/*.c
,最终结果是:
src/*.c lib/*.c
这表示 src
和 lib
目录下的所有 .c
文件。
3. $(wildcard ...)
wildcard
是 Makefile
中的一个函数,用于匹配文件名。它接受一个模式字符串并返回匹配该模式的所有文件路径。假设有如下目录结构:
src/
file1.c
file2.c
lib/
file3.c
执行:
$(wildcard src/*.c lib/*.c)
将返回:
src/file1.c src/file2.c lib/file3.c
4. 综合结果
首先,$(patsubst %,%/*.c, $(SOURCEDIRS))
将 SOURCEDIRS
中的每个目录替换成该目录下的所有 .c
文件(比如 src/*.c lib/*.c
)。然后,wildcard
函数会列出这些目录下所有匹配 .c
文件的实际路径。最终,SOURCES
变量将包含所有 .c
文件的路径。
5.举例
假设 SOURCEDIRS
如下:
SOURCEDIRS := src lib
且目录结构为:
src/
file1.c
file2.c
lib/
file3.c
那么,执行后的结果是:
SOURCES := src/file1.c src/file2.c lib/file3.c
SOURCES
变量将包含这三个 .c
文件的路径。
lstat 判断文件权限用的宏
在 lstat
中判断文件权限通常涉及到使用文件的 mode (权限掩码)。通过 lstat
获取文件的属性后,可以通过位运算和相应的宏来判断文件的权限。
在 Linux 中,文件权限包括读、写、执行权限,分别对应 Owner (文件拥有者)、Group (文件所属组)和 Others (其他用户)权限。这些权限在 struct stat
结构体中的 st_mode
字段内。
1. lstat
函数
lstat
是用于获取文件或符号链接的状态信息的系统调用。其原型如下:
#include <sys/stat.h>
int lstat(const char *pathname, struct stat *statbuf);
调用 lstat
后,你会得到一个 struct stat
结构体,其中的 st_mode
字段保存了文件的模式(即文件权限)。
2. st_mode
字段和文件权限
st_mode
字段是一个位掩码,包含了文件的类型和权限信息。通过一些宏,你可以解析出不同类型的权限。
3. 判断文件权限的宏
以下是一些常见的宏,它们可以用来从 st_mode
中提取文件权限:
S_ISDIR(st_mode)
:判断是否为目录。S_ISREG(st_mode)
:判断是否为常规文件。S_ISLNK(st_mode)
:判断是否为符号链接。S_ISCHR(st_mode)
:判断是否为字符设备文件。S_ISBLK(st_mode)
:判断是否为块设备文件。S_ISFIFO(st_mode)
:判断是否为 FIFO 文件(命名管道)。S_ISSOCK(st_mode)
:判断是否为套接字。
关于权限的宏:
S_IRUSR
:用户读取权限(Owner read)。S_IWUSR
:用户写入权限(Owner write)。S_IXUSR
:用户执行权限(Owner execute)。S_IRGRP
:组读取权限(Group read)。S_IWGRP
:组写入权限(Group write)。S_IXGRP
:组执行权限(Group execute)。S_IROTH
:其他用户读取权限(Others read)。S_IWOTH
:其他用户写入权限(Others write)。S_IXOTH
:其他用户执行权限(Others execute)。
4. 示例代码:如何使用 lstat
判断文件权限
以下是一个示例,展示如何使用 lstat
和上述宏判断文件的权限:
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
void check_permissions(const char *path) {
struct stat st;
if (lstat(path, &st) == -1) {
perror("lstat");
return;
}
printf("File: %s\n", path);
// 检查文件类型
if (S_ISDIR(st.st_mode)) {
printf("It is a directory.\n");
} else if (S_ISREG(st.st_mode)) {
printf("It is a regular file.\n");
} else if (S_ISLNK(st.st_mode)) {
printf("It is a symbolic link.\n");
} else {
printf("Unknown file type.\n");
}
// 检查文件权限
if (st.st_mode & S_IRUSR) printf("Owner has read permission.\n");
if (st.st_mode & S_IWUSR) printf("Owner has write permission.\n");
if (st.st_mode & S_IXUSR) printf("Owner has execute permission.\n");
if (st.st_mode & S_IRGRP) printf("Group has read permission.\n");
if (st.st_mode & S_IWGRP) printf("Group has write permission.\n");
if (st.st_mode & S_IXGRP) printf("Group has execute permission.\n");
if (st.st_mode & S_IROTH) printf("Others have read permission.\n");
if (st.st_mode & S_IWOTH) printf("Others have write permission.\n");
if (st.st_mode & S_IXOTH) printf("Others have execute permission.\n");
}
int main() {
const char *file_path = "testfile"; // 替换为你的文件路径
check_permissions(file_path);
return 0;
}
5. 解释
lstat(path, &st)
:获取文件状态信息,并将结果存储在st
中。S_ISDIR(st.st_mode)
等宏用于检查文件的类型。- 权限是通过位掩码来检查的,例如,
st.st_mode & S_IRUSR
会判断是否设置了用户的读取权限。
6. 结果示例
假设文件 testfile
拥有如下权限:-rwxr-xr--
(即用户有读、写、执行权限,组有读、执行权限,其他用户只有读取权限)。执行上述程序,输出可能如下:
File: testfile
It is a regular file.
Owner has read permission.
Owner has write permission.
Owner has execute permission.
Group has read permission.
Group has execute permission.
Others have read permission.