首先,感谢您的提前帮助。我必须编写一个程序,在该程序中,我传递一个要从终端机中搜索的元素,并且父进程将终端机定义的维数组(由随机数组成)分成相等的部分,每个均由子进程管理,相同的代码。每个孩子都会在数组的一部分中寻找元素,以便在子进程之间公平地分配工作。
问题在于,如果不对数组进行排序,我将不知道如何制作此分区。我以为我可以进行合并/鸡尾酒或快速排序, 但是我认为这对于这项任务来说太过丰富和无用了。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
int partition(int x, int y);
int main(int argc, char*argv[]){
int i, j, result, state_wait, *v, n_children, dim, random_number;
int elem,div,lower,higher;
pid_t pid;
srand(time(NULL));
if(argc<4){
fprintf(stderr,"Insufficient parameters\n");
exit(EXIT_FAILURE);
}
n_children=atoi(argv[1]);
if(n_children<0){
fprintf(stderr,"Enter a positive number of children\n");
exit(EXIT_FAILURE);
dim=atoi(argv[2]);
if(dim<0||dim>n_children){
fprintf(stderr,"Enter a valid size\n");
exit(EXIT_FAILURE);
elem=atoi(argv[3]);
fprintf(stdout,"F: Father || PID = %d\n",getpid());
v=(int*)malloc(sizeof(int)*dim);
fprintf(stdout,"F: VECTOR:\n\n");
for(i=0;i<dim;i++){
v[i]=rand();
fprintf(stdout,"(%d) v[%d] number = %d\n",i,i,v[i]);
}
for(j=0;j<n_children;j++){
if(fork()==0){
fprintf("F: Child N. = %d || PID = %d\n",i,getpid());
div=partition(dim,n_children);
//lower=? j*div?
higher=lower+div-1; //except the final case when it is dim-1
result=search(lower,higher,&elem);
}
}
}
int partition(int x, int y){
int div=(x/y); //If I had a vector of 1000 elem., work on them must be fairly distributed among the children
//number of elements each group
if((x-div)>1)
div=(x/y)+1;
return div;
}
int search(int lower,int higher, int*elem){
int i;
for(i=lower;i<=higher;i++){
if(v[i]==elem){
fprintf(stdout,"Element found [position = %d]\n",i);
exit(1);
}
}
exit(-1);
}
答案 0 :(得分:0)
我相信您可以使用文件描述符在进程之间进行通信。这称为管道。之后,您可以将数组拆分为可用的子进程数,也许包括父进程数。将这些拆分零件存储在创建的管道中。让子进程获取文件描述符中的元素!我认为数组是否排序无关紧要,无论如何,任务都被N除(如果N是子代数)。搜索
man 2 pipe
在linux(或MacOS)终端中获取更多信息!