在Linux下用C语言完成以下任务,首先随机生成10个100以内的整数,并将这些数存放在名为data.txt的文件中。之后创建三个进程和两个管道。进程一的任务是读出data.txt中的数据并将其写入管道一;进程二的任务是从管道一中取出数据,并对它们进行求和,将新的结果写入管道二;进程三的任务是从管道二中取出数据并将其保存在新的名为result.txt的文件中,请给出具体的C语言代码。
时间: 2024-03-27 18:35:37 浏览: 62
生成随机数的C语言代码
以下是具体的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#define DATA_NUM 10
#define MAX_NUM 100
int main() {
int data[DATA_NUM];
pid_t pid1, pid2, pid3;
int fd[2], fd2[2];
int sum = 0;
int i;
// 随机生成10个100以内的整数
for (i = 0; i < DATA_NUM; i++) {
data[i] = rand() % MAX_NUM + 1;
}
// 将这些数存放在名为data.txt的文件中
FILE* fp = fopen("data.txt", "w");
for (i = 0; i < DATA_NUM; i++) {
fprintf(fp, "%d\n", data[i]);
}
fclose(fp);
// 创建两个管道
if (pipe(fd) < 0 || pipe(fd2) < 0) {
perror("pipe error");
exit(1);
}
// 创建进程1,读出data.txt中的数据并将其写入管道一
pid1 = fork();
if (pid1 < 0) {
perror("fork error");
exit(1);
} else if (pid1 == 0) {
close(fd[0]);
fp = fopen("data.txt", "r");
if (fp == NULL) {
perror("open data.txt error");
exit(1);
}
for (i = 0; i < DATA_NUM; i++) {
fscanf(fp, "%d", &data[i]);
write(fd[1], &data[i], sizeof(int));
}
fclose(fp);
close(fd[1]);
exit(0);
}
// 创建进程2,从管道一中取出数据,并对它们进行求和,将新的结果写入管道二
pid2 = fork();
if (pid2 < 0) {
perror("fork error");
exit(1);
} else if (pid2 == 0) {
close(fd[1]);
close(fd2[0]);
for (i = 0; i < DATA_NUM; i++) {
read(fd[0], &data[i], sizeof(int));
sum += data[i];
}
write(fd2[1], &sum, sizeof(int));
close(fd[0]);
close(fd2[1]);
exit(0);
}
// 创建进程3,从管道二中取出数据并将其保存在新的名为result.txt的文件中
pid3 = fork();
if (pid3 < 0) {
perror("fork error");
exit(1);
} else if (pid3 == 0) {
close(fd2[1]);
fp = fopen("result.txt", "w");
if (fp == NULL) {
perror("open result.txt error");
exit(1);
}
read(fd2[0], &sum, sizeof(int));
fprintf(fp, "%d\n", sum);
fclose(fp);
close(fd2[0]);
exit(0);
}
// 父进程等待子进程结束
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
waitpid(pid3, NULL, 0);
return 0;
}
```
这段代码首先随机生成10个100以内的整数,并将这些数存放在名为data.txt的文件中。之后创建了两个管道。接着创建了三个进程,进程1负责读出data.txt中的数据并将其写入管道一,进程2负责从管道一中取出数据并对它们进行求和,将新的结果写入管道二,进程3负责从管道二中取出数据并将其保存在新的名为result.txt的文件中。最后父进程等待子进程结束。
阅读全文