こんにちは、子プロセスと親プロセスの間で共有メモリを使用する例を実装しようとしています。目的は、子プロセスがユーザーからの入力として指定されたサイズのフィボナッチ数列を計算し、すべての数値を配列の要素として書き込む必要があることです。その後、プロセスはこの配列を出力します。問題は、このメモリ セグメントを作成し、操作の前にアタッチすると正常に動作することです。操作fork()
を行った後、fork()
子プロセスはそのメモリ セグメントに到達して配列を適切に生成し、最終的に親は子がジョブを終了した後に配列を出力できます。コードは次のとおりです。
create memory segment
attach memory segment
initialize the array elements to zero
fork()
if(pid==0)// Child Process
call the child function and send the pointer of a structure which includes the array and array size
return to parent and printout the array properly
これは私が実装した最初の例です。ただし、以下の完全なコードを見ることができるので、別の方法を使用しようとしています。
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <string.h>
#define MAX_SEQUENCE 10
typedef struct {
long fib_sequence[MAX_SEQUENCE];
int sequence_size;
} shared_data;
void child_func(shared_data* dataPtr);
void main(int argc,char *argv[]){
int shmID,size,status,i;
shared_data* dataPtr;
pid_t pid;
if((pid=fork())<0){
printf("Error while fork()\n");
exit(0);
}
else if(pid>0){ // Parent Process
if((shmID = shmget(IPC_PRIVATE, MAX_SEQUENCE*sizeof(long), IPC_CREAT | 0666))<0){
printf("Allocation process was unsuccesfull\n");
exit(0);
}
dataPtr = (shared_data*) shmat(shmID,NULL,0);
for(i=0; i<MAX_SEQUENCE; i++)
dataPtr->fib_sequence[i]==0;
dataPtr->sequence_size = atoi(argv[1]);
if((dataPtr->sequence_size) < 0){
printf("You entered an invalid(negative) size number\n");
exit(0);
}
else if((dataPtr->sequence_size) > MAX_SEQUENCE){
printf("Please enter a value less than MAX_VALUE\n");
exit(0);
}
wait(status); // Wait untill child finishes its job
for(i=0; i<dataPtr->sequence_size; i++)
printf("%ld ", dataPtr->fib_sequence[i]);
printf("\n");
shmdt((void *) dataPtr);
shmctl(shmID,IPC_RMID,NULL);
}
else{ // Child Process
child_func(dataPtr);
exit(0);
}
}
void child_func(shared_data* dataPtr){
int index;
printf("I am in Child Process\n");
printf("Size of array %d\n", dataPtr->sequence_size);
dataPtr->fib_sequence[0];
if((dataPtr->sequence_size) > 0){
dataPtr->fib_sequence[1]=1;
for(index=2; index < dataPtr->sequence_size; index++)
dataPtr->fib_sequence[index] = dataPtr->fib_sequence[index-1] + dataPtr->fib_sequence[index-2];
}
}
子プロセスに入ったときに2番目の例を実行すると、意味のない値が出力されますdataPtr->fib_sequence
。いくつかの質問に興味があります。
- 2 番目の例では、子の dataPtr->size の間違った値を出力する理由
fork()
最初の例では、操作の前にこのようなことを行っているため、親プロセスでメモリセグメントを作成してアタッチすることを認めることができますか?