【问题标题】:Searching with fork in C在 C 中使用 fork 进行搜索
【发布时间】:2012-10-04 06:57:54
【问题描述】:

我应该对 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。为什么这不能正常工作。

【问题讨论】:

  • 不是您的解决方案,但您是否打算用 15 个值初始化 16 个 int 的数组?
  • “我应该习惯用叉子” - 试试勺子,小心刀子:-)
  • 您的子进程不应该搜索(a, search, start, (start + end) / 2)而不是(a, search, start, end/2)吗?两者仅在 start == 0 时等价,但并非总是如此...
  • @EdHeal 哈哈。好的,那很好。

标签: c fork binary-search


【解决方案1】:
if(child == 0) return forkSearch(a, search, start, end/2);

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

你的程序有未定义的行为,因为

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

如果是start == end,则不返回值,而是*(a+end) != search。在内层if后面加上exit(0);,退出没有找到目标的进程。

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

forkSearch(searchArray, 12, 0, MAXINDEX)

将导致对searchArray[MAXINDEX] 的越界访问,也是未定义的行为。

【讨论】:

  • 好吧,关于在桶里打鱼的事,但不幸的是,我没听懂这个笑话。
  • 现在它只是无限循环运行..?固定的。找到了。 -1 在错误的位置吗..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多