解決すべき質問がありますが、エラーが発生しています:
2009-EE-182-Part2.c: In function ‘main’:
2009-EE-182-Part2.c:35:13: error: expected identifier or ‘(’ before ‘->’ token
2009-EE-182-Part2.c:40:22: error: expected identifier or ‘(’ before ‘->’ token
2009-EE-182-Part2.c:41:14: error: expected identifier or ‘(’ before ‘->’ token
2009-EE-182-Part2.c:42:22: error: expected expression before ‘shared_data’
2009-EE-182-Part2.c:44:15: error: expected identifier or ‘(’ before ‘->’ token
2009-EE-182-Part2.c:54:15: error: expected expression before ‘shared_data’
2009-EE-182-Part2.c:55:19: error: expected expression before ‘shared_data’
コードは次のとおりです。
# include <stdio.h>
# include <sys/shm.h>
# include <sys/stat.h>
# include <sys/types.h>
# include <unistd.h>
# define MAX_SEQUENCE 10
typedef struct{
long fib_sequence[MAX_SEQUENCE];
int sequence_size;
} shared_data;
char* shared_memory; /* a pointer to the shared memory segment */
int main()
{
int a,b,m,n,i,j;
a=0; b=1;
printf("Enter the number of a Fibonacci Sequence:\n");
scanf("%d", &m);
if (m < 0)
printf("Please enter a non-negative integer\n");
else if (m> MAX_SEQUENCE)
printf("Please enter an integer less than 10\n");
int segment_id; /* the identifier for the shared memory segment */
int segment_size = sizeof(shared_data); /* the size (in bytes) of the shared memory segment */
segment_id = shmget(IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR); /** allocate a shared memory segment */
shared_data *shared_memory = shmat(segment_id, NULL, 0); /** attach the shared memory segment */
printf("\nshared memory segment %d attached at address %p\n", segment_id, shared_memory);
shared_data->sequence_size = m;
pid_t pid;
pid = fork();
if (pid == 0){
printf("Child is producing the Fibonacci Sequence...\n");
shared_data->fib_sequence[0] = a;
shared_data->fib_sequence[1] = b;
for (i=2;i<shared_data->sequence_size;i++){
n=a+b;
shared_data->fib_sequence[i] = n;
a=b;
b=n;
}
printf("\nChild ends\n");
}
else{
printf("Parent is waiting for child to complete...\n");
wait(NULL);
printf("Parent ends\n");
for(i=0;i<= shared_data->sequence_size;i++)
printf("%ld ", shared_data->fib_sequence[i]);
}
/**printf("%s \n", shared_memory); now print out the string from shared memory */
/** now detach the shared memory segment */
if ( shmdt(shared_memory) == -1) {
fprintf(stderr, "Unable to detach\n");
}
/** now remove the shared memory segment */
shmctl(segment_id, IPC_RMID, NULL);
return 0;
}
声明は、「フィボナッチプログラムを設計するアプローチは、親プロセスと子プロセスの間に共有メモリセグメントを確立することです。この手法により、子はフィボナッチ数列の内容を共有メモリセグメントに書き込み、親にシーケンスを出力させることができます。子が完了したとき. メモリは共有されているため, 子が行う変更は親プロセスにも反映されます. このプログラムは、 http: //graphics.im.ntu.edu.twで説明されているように、POSIX 共有メモリを使用して構築されます. /~robin/courses/os07/code/03proc/shm-posix.c このプログラムでは、最初に共有メモリ セグメントのデータ構造を作成する必要があります。これは、構造体を使用して最も簡単に実現できます。このデータ構造には 2 つの項目が含まれます: 1. フィボナッチ値を保持するサイズ MAX_SEQUENCE の固定サイズの配列と 2. 子プロセスが生成するシーケンスのサイズ、つまり sequence_size (sequence_size ≤ MAX_SEQUENCE)。
これらの項目は、次のように構造体で表すことができます。
# define MAX_SEQUENCE 10
typedef struct{
long fib_sequence[MAX_SEQUENCE];
int sequence_size;
} shared_data;
親プロセスは次の手順で進みます。コマンド ラインで渡されたパラメーターを受け入れ、エラー チェックを実行して、パラメーターが ≤ MAX_SEQUENCE であることを確認します。b. サイズ shared_data の共有メモリ セグメントを作成します。c. 共有メモリ セグメントをそのアドレス空間にアタッチします。d. コマンド ラインで、sequence_size の値をパラメーターに設定します。e. 子プロセスを fork し、wait() システム コールを呼び出して、子プロセスが終了するのを待ちます。f. 共有メモリ セグメントのフィボナッチ数列の値を出力します。g. 共有メモリ セグメントを切り離して削除します。
共有メモリ セグメントは、親のアドレス空間だけでなく、子のアドレス空間にも接続されます。子プロセスは、フィボナッチ数列を
共有メモリ セグメント。子プロセスがフィボナッチ数列の生成を完了するまで、親プロセスがフィボナッチ数列を出力しないように、親プロセスと子プロセスを同期する必要があります。注: コンソールに十分なメッセージを表示して、子プロセスの作成や終了など、特定のアクションが実行されたときにユーザーに知らせるようにしてください。"
専門家の心親切に助けてください。