资源描述
操作系统实验三
完成人:谌浩旗 学号:71109424 日期:2011-4-8
【实验内容】
在Linux操作系统上,利用fork()创建一个子进程去生成Fibonacci数列,并采用POSIX share memory 将结果传递给父进程,具体要求见”Operating System Concepts(Seventh Edition)” Chapter 3后的习题3.10。编写程序并在父进程中输出测试结果
【实验目的】
1. 通过实验,了解Unix/Linux中新进程的创建,以及父进程与子进程之间关系
2. 通过实验,掌握共享内存的创建、使用和删除
【设计思路】
1. 在创建子进程的前面用相应的函数创建共享内存
2. 创建子进程,并在子进程内修改内存中存储的值
3. 在父进程中输出内存中存储的值
【流程图】
创建共享内存
创建子进程并修改内存的值
父进程中输出修改后的值
【主要数据结构及其说明】
struct Fibonacci { //结构体,用来存储
long fib_sequence [MAX_SEQUENCE]; //数组,存储Fibonacci数值
int sequence_size; //数组的大小
} shared_data;
【源程序并附上注释】
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>
#define MAX_SEQUENCE 10
//定义共享内存段数据结构
typedef struct
{
long fib_sequence [MAX_SEQUENCE];
int sequence_size;
} shared_data;
int main(int argc, char **argv)
{
//读取表示数列长度的参数,将其转化为int型
int size = 0;
int i = -1;
while(argv[2][++i] != '\0')
size = size * 10 + (int)argv[2][i] - (int)'0';
//参数合法判断
if (size < 0 || size > MAX_SEQUENCE)
{
printf("wrong argument\n");
return -1;
}
//共享内存段标识符
int segment_id;
//一个指向共享内存段的指针
shared_data *shared_memory;
//创建共享内存段
segment_id = shmget(IPC_PRIVATE, sizeof(shared_data), S_IRUSR | S_IWUSR);
//加入共享内存
shared_memory = (shared_data *)shmat(segment_id, NULL, 0);
//将来自命令行的参数赋值给shared_data
shared_memory->sequence_size = size;
//创建子进程
pid_t pid;
pid = fork();
//创建失败
if (pid < 0)
{
printf("create child process failed\n");
return -1;
}
//子进程操作
else if (pid == 0)
{
//构造Fabonacci数列,并将数据写入共享内存段
long preNum = 0,
behNum = 1,
temp;
for (int i = 0; i < shared_memory->sequence_size; ++i)
{
shared_memory->fib_sequence[i] = behNum;
temp = preNum + behNum;
preNum = behNum;
behNum = temp;
}
//子进程分离共享内存段
shmdt(shared_memory);
}
//父进程操作
else if (pid > 0)
{
//等待子进程退出
wait(NULL);
//打印共享内存段的信息
printf("Fibonacci: ");
for (int i = 0; i < shared_memory->sequence_size; ++i)
printf("%ld ", shared_memory->fib_sequence[i]);
printf("\n");
//父进程分离共享内存段
shmdt(shared_memory);
//父进程删除共享内存段
shmctl(segment_id, IPC_RMID, NULL);
}
return 0;
}
【程序运行时的初值和运行结果】
【实验体会】
在使用函数创建共享内存时,应当注意函数的返回形式,必要的时候要做强制转换。
展开阅读全文