C-系统调用-N个子进程的数组分区-

时间:2018-11-09 15:41:52

标签: c linux unix process system-calls

首先,感谢您的提前帮助。我必须编写一个程序,在该程序中,我传递一个要从终端机中搜索的元素,并且父进程将终端机定义的维数组(由随机数组成)分成相等的部分,每个均由子进程管理,相同的代码。每个孩子都会在数组的一部分中寻找元素,以便在子进程之间公平地分配工作。

问题在于,如果不对数组进行排序,我将不知道如何制作此分区。我以为我可以进行合并/鸡尾酒或快速排序, 但是我认为这对于这项任务来说太过丰富和无用了。

这是代码:

#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);
    }

1 个答案:

答案 0 :(得分:0)

我相信您可以使用文件描述符在进程之间进行通信。这称为管道。之后,您可以将数组拆分为可用的子进程数,也许包括父进程数。将这些拆分零件存储在创建的管道中。让子进程获取文件描述符中的元素!我认为数组是否排序无关紧要,无论如何,任务都被N除(如果N是子代数)。搜索 man 2 pipe 在linux(或MacOS)终端中获取更多信息!