1 在 Ubuntu 或 openEuler 中完成任务(推荐openEuler)
2 提交运行 ls | sort -r的结果,总结管道的功能 (2分)
3 使用Linux系统调用编写实现管道(pipe)功能时,需要什么系统调用?提交man -k 相关截图。(2分)
4 使用系统调用创建一个管道,父进程向管道写入数据,子进程从管道读取数据。在父进程中使用 write 系统调用写入字符串 “你的八位学号+姓名” ,并在子进程中使用 read 系统调用读取数据并打印。提交代码,编译运行过程截图(可文本)(7分)
5 提交git log结果(3分)
提交运行 ls | sort -r 的结果,总结管道的功能
在Linux中,管道(pipe)是一种将多个命令连接起来执行的机制,它允许一个命令的输出直接作为另一个命令的输入。ls | sort -r 命令的管道操作会列出当前目录下的文件和目录,然后按字典顺序逆序排序。
管道的功能总结:
数据流传递:管道允许将一个命令的输出作为另一个命令的输入,实现数据流的传递。
命令组合:可以组合多个命令,以实现更复杂的数据处理。
简化操作:通过管道,可以减少中间步骤,如临时文件的创建,使得操作更加简洁高效。
运行结果示例:
$ ls | sort -r
your_file3.txt
your_file2.txt
your_file1.txt
…
3. 使用Linux系统调用编写实现管道(pipe)功能时,需要什么系统调用?提交man -k 相关截图。
实现管道功能时,需要以下系统调用:
pipe():创建管道。
fork():创建子进程。
read():从管道读取数据。
write():向管道写入数据。
close():关闭文件描述符。
- 使用系统调用创建一个管道,父进程向管道写入数据,子进程从管道读取数据。
以下是使用系统调用创建管道并进行读写操作的C语言代码示例:
c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() {
int pipefd[2];
pid_t cpid;
char buf;
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { // 子进程
close(pipefd[1]); // 关闭写端
while (read(pipefd[0], &buf, 1) > 0) {
write(STDOUT_FILENO, &buf, 1);
}
close(pipefd[0]);
exit(EXIT_SUCCESS);
} else { // 父进程
close(pipefd[0]); // 关闭读端
char *msg = "你的八位学号+姓名";
write(pipefd[1], msg, strlen(msg));
close(pipefd[1]); // 写入完毕后关闭写端
wait(NULL); // 等待子进程结束
}
return 0;
}
编译运行过程:
gcc -o pipe_example pipe_example.c
./pipe_example