C - Системные вызовы - Разделение массива для N дочерних процессов - - PullRequest
0 голосов
/ 09 ноября 2018

Прежде всего, спасибо за помощь заранее. Я должен написать программу, в которой я передаю элемент для поиска из терминала и в котором родительский процесс делит массив (состоящий из случайных чисел) измерений - определенных терминалом - на равные части, каждый из которых управляется дочерним процессом с тот же код Каждый дочерний элемент заботится о поиске элемента в части массива, чтобы справедливо разделить работу между дочерними процессами.

Проблема в том, что я не знаю, как сделать этот раздел без сортировки массива. Я думал, что смогу сделать вид слияния / коктейля или быстрой сортировки, но я думаю, что это переизбыток и бесполезно для этой задачи.

Вот это код:

#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 голосов
/ 09 ноября 2018

Я считаю, что вы можете использовать файловые дескрипторы для связи между процессами.Это называется труба.После этого вы можете разбить массив на количество доступных дочерних процессов, возможно, включая родительский.Сохраните эти разделенные части в трубе, которую вы создали.Позвольте дочернему процессу выбрать элемент в дескрипторе файла!Я не думаю, что это имеет значение, если массив отсортирован или нет, задача делится на N (если N количество детей) в любом случае.Ищите man 2 pipe в терминале linux (или MacOS) для получения дополнительной информации!

...