0

我应该对 fork 感到满意,我看到一个练习说使用 fork 调用来搜索索引从 0 到 15 的数组。我们假设每个进程只能做两件事......( 1) 是检查数组的长度是否为 1,以及 (2) 将数组的单个元素与正在搜索的数字进行比较。基本上我给它传递了一个数字,它应该做有限数量的分叉并返回该数字的索引。这是我的代码..

#define MAXINDEX 16

int forkSearch(int a[], int search, int start, int end){
  if(start == end){
    if(*(a + end) == search){
      return end;
    }
  } 
  else{
    pid_t child = fork();
    if(child == 0) return forkSearch(a, search, start, end/2);
    else return forkSearch(a, search, (start + end)/2, end);
  }
}

int main(int argc, char* argv[]){
  int searchArray[MAXINDEX] = {1, 12, 11, 5, 10, 6, 4, 9, 13, 2, 8, 14, 3,\
                               15, 7};
  printf("Should be 1. Index of 12 = %d\n", forkSearch(searchArray,
                                                       12, 0, MAXINDEX));
  return 0;
} 

这个快速爆炸的程序返回的所有内容似乎都是 1、10、11 或 13。为什么这不能正常工作。

4

1 回答 1

4
if(child == 0) return forkSearch(a, search, start, end/2);

那里错了end,应该是(start+end)/2,右半边搜索的起始索引应该是(start+end)/2 + 1。否则,如果右半部分是(start+end)/2 .. end,when end == start+1start递归调用的 for 是旧start值,并且您有一个无限循环。

您的程序具有未定义的行为,因为

int forkSearch(int a[], int search, int start, int end){
  if(start == end){
    if(*(a + end) == search){
      return end;
    }
  }

如果 不返回值start == end,但是*(a+end) != searchexit(0);在内部之后添加一个if以退出未找到目标的进程。

int searchArray[MAXINDEX] = {...};

forkSearch(searchArray, 12, 0, MAXINDEX)

将导致在 的越界访问searchArray[MAXINDEX],以及未定义的行为。

于 2012-10-13T19:53:16.870 回答