0

私はフォークに慣れているはずで、フォーク呼び出しを使用して0から15までのインデックスが付けられた配列を検索するという演習を見ました。各プロセスは2つのことしか実行できないと想定しています...( 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の場合end == start+1start再帰呼び出しの は古い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. ターゲットが見つからなかったプロセスを終了するexit(0);には、インナーの後に を追加します。if

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

forkSearch(searchArray, 12, 0, MAXINDEX)

で境界外アクセスにつながりsearchArray[MAXINDEX]、これも未定義の動作になります。

于 2012-10-13T19:53:16.870 に答える