# 1.Linux 执行多个命令(shell 命令)

l
#逐条执行命令
echo 1; echo 2; echo 3  #即使命令执行错误也不影响后面的命令继续执行
#前面的成功执行后面才执行
echo 1 && echoo 2 && echo 3 && echo 4 #2 出错,不会执行 echo3 ,echo4
#前一条命令失败然后才继续执行后面的命令
echo 1 || echo 2 || echo 3 || echo 4  #当第一个执行成功时,后面的就都不会执行;当第一个命令失败时,就开始执行 echo2,后面同理
#混合使用分隔符
echo 1 || echo 2 || echo 3 &&  echo 4  # 因为 || 分隔符,按照 顺序 只要前面三个执行成功一个其他的就不执行,然后执行 echo4(因为 && 前面的被看作一个整体,一个成功就视为成功,就执行 echo 4)

https://blog.csdn.net/bandaoyu/article/details/117296907

# 2. 命令输出重定向

l
command  >  file #将命令执行结果输出到 file 中,命令的输出结果覆盖原有文件的内容(会清空旧内容)
command  >>  file #将命令的输出结果输出到 file 文件的原内容的下一行
command  <  file # 将输入重定向到 file

https://www.runoob.com/linux/linux-shell-io-redirections.html

# 3.fork () 函数

fork 函数用于创建一个进程,所创建的进程 复制父进程的代码段 / 数据段 / BSS 段 / 堆 / 栈等所有用户空间信息 ;在内核中操作系统重新为其申请了一个 PCB,并使用父进程的 PCB 进行初始化;

父进程与子进程的 pid 不同,执行顺序也不一定,要看系统的进程调度策略

fork 被调用一次会返回两次(后面的语句也就判断 2 次),返回 0 代表其是子进程,而在父进程中接到的返回值是子进程的 pid,fork 为负值代表出现错误

fork 调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

  1. 在父进程中,fork返回新创建子进程的进程ID;
    
  2. 在子进程中,fork返回0;
    
  3. 如果出现错误,fork 返回一个负值;

    子进程的 fork()返回值为 0 #第一次返回(不分先后,第一次返回也可能是父进程的 fork)
    父进程的 fork()返回值为子进程的 pid #第二次返回

https://blog.csdn.net/cckluv/article/details/109169941

# 4.Linux 下的 exec 命令

  1. 在一个 shell 里面,执行 exec ls; 那么,当列出了当前目录后,这个 shell 就自己退出了,因为这个 shell进程已被替换为仅仅执行ls命令的一个进程 ,执行结束自然也就退出了 。
  2. exec 文件重定向,可以将文件的重定向就看为是 shell 程序的文件重定向, 当exec命令来对文件描述符操作的时候,就不会替换shell,而且操作完成后,还会继续执行接下来的命令。

应用:可以 重新开启标准输出流

exec (cat [文件名])1>&0 , 使文件的标准输出流到标准输入里 (在 Linux 系统中文件描述符 1为标准输出流,0为标准输入流,2为标准错误(输出到屏幕) ,而通过 &+文件描述符 的方式可以代替文件名,(这里就指向了该终端,所以结果显示在终端上 因为默认打开一个终端后,0,1,2都指向该终端

https://www.cnblogs.com/bulh/articles/12760617.html

https://blog.csdn.net/qq_31186123/article/details/82190776

# 5.echo 命令

echo 命令是 Linux 中最基本和最常用的命令之一。 传递给 echo 的参数被打印到 标准输出 中。

echo 通常用于 shell 脚本 中,用于 显示消息输出 其他命令的结果。
Shellecho 指令与 PHPecho 指令类似,都是用于字符串的输出

echo "test"echo test 效果一致,双引号可以省略

# 显示结果定向至文件

echo "It is a test" > myfile

# 显示命令执行结果

这里运用的是反双引号

echo `date`

# 6. c++filt 命令

在 C++ 中, 是允许函数重载的, 也就引出了编译器的 name mangling 机制

c++filt 的作用就是还原函数名字,它可以帮我们查找动态链接库中缺少的函数,还原崩溃堆栈中一大串的函数名字母等等

查看一个 ida 反编译出来的 c++ 伪代码

利用命令 c++filt

可以发现将原来的函数还原了,后面的乱序代码原来为 compare (用作判断相等 == )

cfilt 命令可以还原 C 为实现函数重载采用 name mangling 搞出来的奇奇怪怪的函数名
注册信号回调函数方式:signal (SIGSEGV, show_stack);,SIGSEGV 代表无效的内存引用
注意 C 语言和 C++ 在编译后函数命名方式的不同,C 语言不支持严格意义的重载,C++ 支持

http://www.008ct.top/blog/2020/05/16 / 使用 c-filt 命令还原 C - 编译后的函数名 /