操作系统实验报告
实验三 进程
一、 基本信息
二、 实验内容
利用fork()创建一个子进程生成一个Fibonacci序列。在父进程和子进程之间建立一个共享内存字段。允许子进程将Fibonacci序列的内容写入共享内存段,当子进程完成时,父进程输出此序列。
三、 实验目的
(1)通过实验,进一步了解新进程的创建,以及父进程与子进程之间的关系。
(2)学习POSIX共享内存,shmget()、shmat()等系统调用。
四、 设计思路和流程图
(1)创建一个大小为shared_data的共享内存段
(2)将共享内存段附加到地址空间
(3)为shared_data赋值
(4)创建子进程,并在子进程内修改内存中存储的值 (5)父进程调用系统调用wait()等待子进程结束 (6)父进程中输出共享内存段中Fibonacci序列的值 (7)释放并删除共享内存段
五、 主要数据结构及其说明
#include
#define MAX_SEQUENCE 10
//Fibonacci结构体 struct fibonacci{
long fib_sequence [MAX_SEQUENCE];
操作系统实验报告
int sequence_size;
} shared_data;
int main() {
int fib_id;
fibonacci-> sequence_size = 10; //创建共享内存段
fib_id = shmget(IPC_PRIVATE, MAX_SEQUENCE, S_IRUSR |
S_IWUSR);
struct fibonacci* fib = (struct fibonacci*)shmat(fib_id, NULL, 0);
//创建子进程 pid_t pid = fork(); if(pid < 0) {
//在子进程中修改内存值 fib->fib_sequence[0] = 1; fib->fib_sequence[1] = 1;
for(int i = 2; i < fibonacci-> sequence_size; i++) fib->fib_sequence[i] = fib->fib_sequence[i - 1] + fib->fib_sequence[i - 2]; }
else//父进程 {
//等待子进程结束
//输出共享内存字段中的序列
wait(NULL);
for(int j = 0; j < fibonacci-> sequence_size; j++) printf(\j]);
printf(“%s”, ”Error!”);
else if(pid == 0)//子进程
操作系统实验报告
}
shmctl(fib_id, IPC_RMID, NULL);//释放并删除共享内存段 }
return 0;
六、 程序运行时的初值和运行结果
七、 实验体会
此次实验中学习了shmget()与shmat()系统调用,并且进一步了解了父进程和子进程之的关系。通过该实验,学习到了父进程与子进程之间如何来使用共享内存段。并且也加深了进程的运行机制。