私は配列を宣言しました:
char * words[1000] = {NULL};
そして今、その配列に単語を追加する一連のフォークされた子プロセスがありますが、それらは親プログラムに影響を与えていません。どうすればそれを変更できますか?
while ブロック内に if ブロックを追加していません!!!
while(i < 1000 && words[i] != NULL)
{
i++;
if(i<1000){
words[i] = (char*) malloc(strlen(temp)+1);
strcpy(words[i], temp);
words[i][strlen(words[i])] = '\0';
printf("Added: %s at location %d\n", words[i], i);
}
}
これを試してみてください中括弧が間違っています:
int i = 0;
while(i < 1000 && words[i] != NULL){
i++;
if(i<1000){
words[i] = (char*) malloc(strlen(temp)+1);
strcpy(words[i], temp);
words[i][strlen(words[i])] = '\0';
printf("Added: %s at location %d\n", words[i], i);
}
}
フォークを使用して子を作成すると、子が配列内の何かを変更すると、各子は配列の独自のコピーを取得し、実際には独自のコピーを変更します。あなたがしようとしていることには、プロセス間通信(IPC)が必要です。作成する必要がありますメモリを共有するか、パイプを作成して、すべての子と親の配列値が変更されるようにします
コード全体を貼り付けてください...あなたがしていると思うことを行うコードを書きましたが、うまくいきました...
#include <stdio.h>
int main(int argc, char *argv[])
{
char* words[1000];
int j;
for(j = 0; j<1000; j++)
words[j] = NULL;
char *temp = "dummy";
for (j = 0; j < 10; j++)
{
int i = 0;
while(i < 1000 && words[i] != NULL)
i++;
printf("Adding something to %d vs %d\n",i,j);
if(i<1000){
words[i] = (char*) malloc(strlen(temp)+1);
strcpy(words[i], temp);
words[i][strlen(words[i])] = '\0';
printf("Added: %s at location %d\n", words[i], i);
}
}
}
/* prints:
Adding something to 0 vs 0
Added: dummy at location 0
Adding something to 1 vs 1
Added: dummy at location 1
Adding something to 2 vs 2
Added: dummy at location 2
Adding something to 3 vs 3
Added: dummy at location 3
Adding something to 4 vs 4
Added: dummy at location 4
Adding something to 5 vs 5
Added: dummy at location 5
Adding something to 6 vs 6
Added: dummy at location 6
Adding something to 7 vs 7
Added: dummy at location 7
Adding something to 8 vs 8
Added: dummy at location 8
Adding something to 9 vs 9
Added: dummy at location 9
*/
うーん、あなたの編集ケースでは:フォークを使用しないで、スレッドを使用してください。すべてが1つのアドレス空間で実行されるためです...
そしてもちろん、ミューテックスを使用して単語配列を保護します...