进程间通信
进程间通信
完成下面任务(14分)
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

管道功能
管道|用于将一个命令的输出作为另一个命令的输入,实现命令之间的数据传输。
在这个例子中,它把ls命令原本输出的常规顺序的文件目录列表传递给 sort -r 命令,让sort -r基于接收到的内容进行反向排序操作,进而改变了最终呈现给用户的信息展示顺序。管道可以灵活地连接多个命令,像搭建积木一样,通过不同命令各自的功能组合,完成诸如对文本内容筛选后再排序、先格式化数据再统计等多样化的数据处理和操作任务,极大地增强了命令行在处理各种文本或数据相关工作时的能力和灵活性。
调用编写实现管道(pipe)功能
- 在 Linux 中实现管道功能主要使用
pipe系统调用。pipe函数用于创建一个管道,它会返回两个文件描述符,一个用于读取管道中的数据(管道的读取端),另一个用于向管道中写入数据(管道的写入端)。 man -k pipe


使用系统调用创建一个管道
父进程向管道写入数据,子进程从管道读取数据。在父进程中使用write系统调用写入字符串 “20221413dujiayan” ,并在子进程中使用read系统调用读取数据并打印。

代码
pipe_example.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#define BUFFER_SIZE 100
int main() {
int pipefd[2];
pid_t pid;
char buffer[BUFFER_SIZE];
// 创建管道
if (pipe(pipefd) == -1) {
perror("pipe");
return 1;
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork");
return 1;
} else if (pid == 0) {
// 子进程关闭写端
close(pipefd[1]);
// 从管道读取数据
ssize_t bytesRead = read(pipefd[0], buffer, BUFFER_SIZE - 1);
if (bytesRead == -1) {
perror("read");
return 1;
}
buffer[bytesRead] = '\0';
// 打印读取到的数据
printf("子进程读取到的数据: %s\n", buffer);
// 关闭读端
close(pipefd[0]);
} else {
// 父进程关闭读端
close(pipefd[0]);
// 准备写入的数据,替换成你的八位学号和姓名
char dataToWrite[] = "20221413dujiayan";
ssize_t bytesWritten = write(pipefd[1], dataToWrite, strlen(dataToWrite));
if (bytesWritten == -1) {
perror("write");
return 1;
}
// 关闭写端
close(pipefd[1]);
// 等待子进程结束
wait(NULL);
}
return 0;
}
git log
commit ffd942a9826062cf73d5835f90fb7ab078b0bc30 (HEAD -> master)
Author: 杜佳妍 <11537850+du-jiayan@user.noreply.gitee.com>
Date: Tue Dec 17 10:31:25 2024 -0800
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐
所有评论(0)