Linux-求随机数之和
一、要求:父进程产生10个子进程,子进程分别产生一个随机数,最后在父进程中将10个随机数求和输出。
二、思路:
此处用文件作为中间桥梁。
创建10个子进程,每个子进程产生随机数,有两种选择:
1.[初始定义两个变量sum,num]每个子进程产生随机数num后,再将sum(sum+=num)将其写入文件中,更新sum值。
最后在父进程中读文件输出sum值即可。
2.[初始定义一个变量num]每个子进程产生随机数num后,再用"%d "(%d后面有个空格,空格在此作为标记字符)将其写入文件中,最后在父进程中在文件中读入一个字符串,然后根据其“以空格为分隔符”累加10个数,算出sum即可。
此处我们用第一种~
三、完整代码:
#include<cstdio>
#include<cstdlib>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
int main(){
int i;
char is_child=0;
//先写入一个0
FILE *fp_w=fopen("text.txt","w");
fprintf(fp_w,"%d",0);
fclose(fp_w);
//创建10个子进程
for(i=0;i<10;i++){
pid_t pid=fork();
if(pid==0){
is_child=1;
break;
}
}
if(is_child){
//子进程创建成功
int sum=0,num=0;
FILE *fp_r=fopen("text.txt","r");
fscanf(fp_r,"%d",&sum);//读
fclose(fp_r);
srand(i);//种子
num=rand()%100;//产生1000以内随机数
printf("the random number is:%d\n",num);
sum+=num;
FILE *fp_w=fopen("text.txt","w+");
fprintf(fp_w,"%d",sum);//写
fclose(fp_w);
} else {
//父进程
sleep(1);
FILE *fp_r=fopen("text.txt","r");
int res=0;
fscanf(fp_r,"%d",&res);
printf("the res=%d\n",res);
fclose(fp_r);
}
}
四、linux下的编译后的运行结果:
五、注意事项:
(1)linux下的gcc编译、运行等:
编译: gcc linux-2.cpp
运行: ./a.out
(2)文件目录:
(3)本题还需要优化,在并发控制上(比如在写文件时,10个子进程几乎同时进行,在写入时失败)不够优化,希望提出意见~
----后面会在此博客末尾更新更好的写法~