当前位置:文档之家› 实验二,进程通信,管道共享内存

实验二,进程通信,管道共享内存

实验二,进程通信,管道共享内存
实验二,进程通信,管道共享内存

操作系统实验报告

实验二:进程通信(一)——管道及共享存

一、实验目的

?了解进程之中相互通信的方式

?加深对管道通信的了解

?了解共享存通信的程序设计方法

?了解和熟悉Linux支持的共享存储区机制

二、实验容和步骤

任务一、

(1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析。

(2)编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串

任务二、

1)阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享存的情况,对两次的结果进行比较,并分析原因。最后用

ipcrm命令删除自己建立的共享存储区。(有关ipcs和ipcrm介绍见后面一页)

(2)每个同学登陆两个窗口,先在一个窗口中运行例3程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),然后在另一个窗口中运行例3程序2,观察程序的运行结果并分析。

运行结束后可以用ctrl+c结束程序1的运行。

(3)编写程序:使用系统调用shmget(),shmat(),shmdt(),shmctl(),编制程序。要求在父进程中生成一个30字节长的私有共享存段。

接下来,设置一个指向共享存段的字符指针,将一串大写字母写入到该指针指向的存贮区。调用fork()生成子进程,让子进程共享存段中的容。接着,将大写字母改成小写,子进显示程修改共享存中的容。之后,子进程将脱接共享存段并退出。父进程在睡眠5秒后,在此显示共享存段中的容(此时已经是小写字母)。

三、代码及运行结果分析

1.任务1(1)

①代码:

#include

#include

#include

#include

#include

#include

int main()

{

int x,fd[2];

char buf[30],s[30];

pipe(fd);

while((x=fork())==-1);

if(x==0){

close(fd[0]);

printf("Child Process!\n");

strcpy(buf,"This is an example\n");

write(fd[1],buf,30);

exit(0);

}

else{

close(fd[1]);

printf("Parent Process!\n");

read(fd[0],s,30);

printf("%s\n",s);

}

}

②截图:

③结果和分析:

创建一个管道,调用fork()函数产生两个进程,我的系统优先先执行父进程,比较疑惑,既然这样,管道中并没有数据是如何得出最后结果的,后来百度了一下解释说是因为管道本身是一种同步机制,并且printf执行的时间要比其他程序时间长得多,才会这样。然

后执行子程序,将数据写入管道,然后父程序打印出来

2. 任务1(2)

①代码:

#include

#include

#include

#include

#include

#include

void fanzhuan(char *s){

char *p=s+strlen(s)-1;

char temp;

while(s

temp=*p;

*p--=*s;

*s++=temp;

}

}

int main()

{

int i,x,fd[2];

char buf[20],s[20],m[20];

strcpy(buf,"This is an example\n");

pipe(fd);

write(fd[1],buf,20);

while((x=fork())==-1);

if(x==0){

printf("Child Process!\n");

read(fd[0],s,20);

//printf("%s\n",s);

fanzhuan(s);

write(fd[1],s,20);

exit(0);

}

else{

wait(NULL);

close(fd[1]);

printf("Parent Process!\n");

read(fd[0],m,20);

printf("%s\n",m);

}

}

②截图:

3. 任务2(1)

①代码:

#include

#include

#include

#include

#include

int main(){

key_t key=105;

int shmid_1,shmid_2;

if((shmid_1=shmget(key,1000,0644|IPC_CREAT))==-1){ perror("shmget shmid_1");

exit(1);

}

printf("First shared memory identifier is %d\n",shmid_1);

if((shmid_2=shmget(IPC_PRIVA TE,20,0644))==-1){ perror("shmget shmid_2");

exit(2);

}

printf("Second shared memory identifier is %d\n",shmid_2);

exit(0);

}

②截图:

相关主题
文本预览
相关文档 最新文档