Linux--输入输出重定向、父进程与子进程的继承关系
一、重定向
在Linux操作系统中,输入输出重定向用于改变命令的输入来源和输出目标。默认情况下,命令从标准输入(stdin,通常是键盘)读取数据,并将结果输出到标准输出(stdout,通常是终端屏幕)。重定向允许你将输入或输出指向文件或其他设备。
常见的重定向操作符
- 输出重定向 (
>
)- 将命令的输出写入文件,覆盖文件原有内容。
- 示例:
ls > file.txt
将ls
的结果写入file.txt
,若文件已存在则覆盖。
- 追加输出重定向 (
>>
)- 将命令的输出追加到文件末尾,不覆盖原有内容。
- 示例:
ls >> file.txt
将ls
的结果追加到file.txt
。
- 输入重定向 (
<
)- 从文件读取输入,而不是键盘。
- 示例:
sort < file.txt
从file.txt
读取内容并排序。
- 标准错误重定向 (
2>
)- 将错误信息写入文件,覆盖文件原有内容。
- 示例:
ls not_exist 2> error.txt
将错误信息写入error.txt
。
- 标准错误追加重定向 (
2>>
)- 将错误信息追加到文件末尾,不覆盖原有内容。
- 示例:
ls not_exist 2>> error.txt
将错误信息追加到error.txt
。
- 合并标准输出和标准错误 (
&>
)- 将标准输出和标准错误都写入同一文件,覆盖文件原有内容。
- 示例:
ls &> output.txt
将输出和错误都写入output.txt
。
- 合并标准输出和标准错误追加 (
&>>
)- 将标准输出和标准错误都追加到同一文件,不覆盖原有内容。
- 示例:
ls &>> output.txt
将输出和错误都追加到output.txt
。
示例
- 输出重定向:
echo "Hello" > hello.txt
将 "Hello" 写入hello.txt
,覆盖原有内容。 - 追加输出重定向:
echo "World" >> hello.txt
将 "World" 追加到hello.txt
。 - 输入重定向:
wc -l < hello.txt
统计hello.txt
的行数。 - 标准错误重定向:
ls not_exist 2> error.txt
将错误信息写入error.txt
。 - 合并输出和错误:
ls not_exist &> output.txt
将输出和错误都写入output.txt
。
总结
输入输出重定向是Linux中强大的工具,能够灵活控制命令的输入和输出,常用于脚本编写和自动化任务。
二、在Linux中,子进程和父进程通过以下方式区分和继承关系:
1. 区分
- 进程ID(PID):每个进程有唯一的PID,父进程的PID称为PPID。
- 创建方式:子进程由父进程通过
fork()
系统调用创建,fork()
返回两次,父进程中返回子进程的PID,子进程中返回0。
2. 继承关系
子进程继承父进程的以下属性:
- 环境变量:子进程继承父进程的环境变量。
- 文件描述符:子进程继承父进程打开的文件描述符。
- 信号处理:子进程继承父进程的信号处理设置。
- 工作目录:子进程继承父进程的当前工作目录。
- 用户和组ID:子进程继承父进程的用户和组ID。
3. 示例代码
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("子进程 PID: %d, 父进程 PID: %d\\\\n", getpid(), getppid());
} else if (pid > 0) {
// 父进程
printf("父进程 PID: %d, 子进程 PID: %d\\\\n", getpid(), pid);
} else {
// fork失败
perror("fork");
return 1;
}
return 0;
}
4. 总结
- 区分:通过PID和
fork()
的返回值区分父子进程。 - 继承:子进程继承父进程的环境变量、文件描述符、信号处理、工作目录和用户/组ID。
理解这些机制有助于更好地管理进程间的关系和资源。