- 3
- 0
- 约4.74千字
- 约 23页
- 2022-11-15 发布于江苏
- 举报
实验三、进程通信(一)----------——管道及共享内存
实验三、进程通信(一)----------——管道及共享内存
运行结果:
分析:
调用pipe(fd);创建一个管道后,接着调用fork()函数产生两个进程,首先开始执行子进程,关闭管道出口,通过管道入口向管道中写入内容。执行if语句后,进入else语句块内开始父进程,管道入口关闭,通过管道出口端从管道中读取之前写入内容,最后输出出来
编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。
实验代码:
#includestdio.h
main()
{ int x,count,left,right,temp,fd[2],fe[2];
char c,buf[30],s[30];
pipe(fd);
pipe(fe);
printf(please input a line of char);
scanf(%s,buf);
while((x=fork())==-1);
if(x==0)
{
close(fd[0]);
close(fe[1]);
printf(Child Process!\n);
write(fd[1],buf,30);
read(fe[0],buf,30);
printf(%s\n,buf);
exit(0);
}
else{
close(fd[1]);
close(fe[0]);
count=0;
do
{read(fd[0],c,1);
s[count++]=c;
}while(c!=\0);
printf(Parent Process!\n);
printf(%s\n,s);
count-=2;
for(left=0,right=count;left=count/2;left++,right--){
temp=s[left];
s[left]=s[right];
s[right]=temp;
}
write(fe[1],s,30);
wait(0);
}
运行结果:
阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享内存的情况,对两次的结果进行比较,并分析原因。最后用ipcrm命令删除自己建立的共享存储区。 (有关ipcs和ipcrm介绍见后面一页)
实验代码:
#include sys/types.h
#include sys/ipc.h
#include sys/shm.h
main()
{
key_t key=208; /*在实际实验过程中,为了避免每个同学建立的共享存储区关键字一样而相互干扰,关键字请用学号末3位*/
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_PRIVATE,20,0644))==-1){
perror(shmget shmid_2);exit(2);
}
printf(Second shared memory identifier is %d\n,shmid_2);
exit(0);
}
运行结果:
Ipcs查看:
再次运行:
再次用ipcs查看:
Ipcrm删除
分析:
成功,返回共享内存段的标识符,内核中用于唯一的标识一个对象。对存在于内核存贮空间中的每个共享内存段,内核均为其维护着一个数据结构shmid_ds。
失败,返回-1,设置errno。
①第一个参数key(键值)用来创建IPC标识符,shmget()返回的标识符与key值一一对应,不同的key值返回不同的标识符。
②第二个参数size,决定了共享内存段的大小(若访问已存在的内存段,该参数可设为0)。有最大字节数的限制
③第三个参数shmflag,用于设置访问权限及标识创建条件。
对两次的结果进行比较:两次运行结束后的 第二个共享标识符是不一样的。在用ipcs查看时,共享内存段中的关键字,共享内存标识符,访问权限,字节等都是不一样的。
(4)每个同学登陆两个窗口,先在一个窗口中运行例3程序1(或者只登陆一个窗口,先在该窗口
原创力文档

文档评论(0)