Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用fork()创建多个进程来不断拆分数组并获取给定数字的索引_C - Fatal编程技术网

C 如何使用fork()创建多个进程来不断拆分数组并获取给定数字的索引

C 如何使用fork()创建多个进程来不断拆分数组并获取给定数字的索引,c,C,我是c语言的新手,我真的不擅长fork()。我需要编写一个程序,使用多个进程将一个数组分成两个相等的部分。当数组只有一个元素时,进程会将单个元素与正在搜索的整数进行比较 例如,拆分数组5、6、7、8。P1创建两个子项,P2分配给搜索5、6,P3分配给搜索7、8。P2创建两个子项,P4分配给搜索5,P5分配给搜索6。P3创建两个子P6(分配给搜索7)和P7(分配给搜索8) 我编写了两个函数来分割数组,它们都工作得很好。第一个函数获取数组的第一部分,第二个函数获取数组的第二部分(我没有写索引部分,因

我是c语言的新手,我真的不擅长fork()。我需要编写一个程序,使用多个进程将一个数组分成两个相等的部分。当数组只有一个元素时,进程会将单个元素与正在搜索的整数进行比较

例如,拆分数组5、6、7、8。P1创建两个子项,P2分配给搜索5、6,P3分配给搜索7、8。P2创建两个子项,P4分配给搜索5,P5分配给搜索6。P3创建两个子P6(分配给搜索7)和P7(分配给搜索8)

我编写了两个函数来分割数组,它们都工作得很好。第一个函数获取数组的第一部分,第二个函数获取数组的第二部分(我没有写索引部分,因为我还没有写索引部分)。但我正在与叉子搏斗()。我认为我使用fork()的方式不能帮助我得到正确的答案,因为它不能到达数组中的每个元素

我的问题是如何更改fork()以允许它将数组中的每个元素与我正在搜索的值进行比较。有人能帮我修一下吗?提前谢谢

fork()
返回时,它会在两个进程(调用进程及其新的子进程)中返回(成功时)。两者都以相同的代码开始(在
fork()
之后的第一个命令)。子进程获取当前状态下内存的精确副本。因此,尽管所有变量现在在其进程中都有自己的“化身”,但它们的值与父进程中的
fork()
之前的值相同

#包括
#包括
#包括
#包括
/*数组元素的类型:*/
typedef int值;
/**用值填充样本数组。
*
*对于这个示例,它只是用conscutive值填充。
*
*@param n数组的大小
*@param arr数组
*/
空填充数组(大小n,值*arr)
{
Value Value;/*辅助,用于提供要设置的值*/
大小\u t i;/*循环索引*/
数值=0;
对于(i=0;i=1){
pid_t pid;
pid=fork();
if(pid<0){
fprintf(stderr,“错误:fork失败!\n”);
返回;
}
如果(pid==0){/*在子进程中*/
尺寸i;
对于(i=n_2;i
我在cygwin上用gcc试过这个。(Cygwin似乎支持Windows上的fork()——这让我感到惊讶。)

输出:

$gcc--版本
通用条款(gcc)5.4.0
版权所有(C)2015免费软件基金会。
$gcc-o forkSearch forkSearch.c
美元/分叉搜索
搜索3。。。
命中3(在父级中找到)
搜索7。。。
命中7(在儿童中发现)

在这个示例中,我没有解决的是(IMHO)实际的挑战:如何将找到的值从子进程传递到父进程(以防万一)。

fork()返回时,它将在两个进程(调用进程及其新的子进程)中返回(成功时)。

。两者都以相同的代码开始(在
fork()
之后的第一个命令)。子进程获取当前状态下内存的精确副本。因此,尽管所有变量现在在其进程中都有自己的“化身”,但它们的值与父进程中的
fork()
之前的值相同

#包括
#包括
#包括
#包括
/*数组元素的类型:*/
typedef int值;
/**用值填充样本数组。
*
*对于这个示例,它只是用conscutive值填充。
*
*@param n数组的大小
*@param arr数组
*/
空填充数组(大小n,值*arr)
{
Value Value;/*辅助,用于提供要设置的值*/
大小\u t i;/*循环索引*/
数值=0;
对于(i=0;i=1){
pid_t pid;
pid=fork();
if(pid<0){
fprintf(stderr,“错误:fork失败!\n”);
返回;
}
如果(pid==0){/*在子进程中*/
尺寸i;
对于(i=n_2;i// arr[0] = 1, arr[1] = 2, arr[2] = 3, arr[3] = 4, arr[4] = 5, arr[5] = 6, arr[6] =7, arr[7] = 8.
// count = 8  which is the length of the array in this case
// value = 6 which is the value that is being searched

int get_first(int arr[], int count)
{
   int half = count / 2;
   int *firstHalf = malloc(half * sizeof(int));
   memcpy(firstHalf, arr, half * sizeof(int));
   return firstHalf;
}

int get_second(int arr[], int count)
{
    int half = count / 2;
    int *secondHalf = malloc(half * sizeof(int));
    memcpy(secondHalf, arr + half, half * sizeof(int));
    return secondHalf;
}

pid_t  pid;
pid = fork();
if (pid == 0) 
  {
      int half = count / 2; 
      int *result = get_first(arr, count);

      while (sizeof(result) != 1)
      {
          half = half / 2 ;
          int *result = get_first(result, half);
      }
      if (result[0] == value[0])
      {
          return the index of value
      }
  }

else 
  {
      int half = count / 2; 
      int *result1 = get_second(arr, count);  

      while (sizeof(result1) != 1)
      {
          half = half / 2 ;
          int *result1 = get_second(result1, half);
      }
      if (result1[0] == value[0])
      {
          return the index of value
      }
  }