2024年2月7日发(作者:)
实验四 进程间通信―共享存储区的创建、附接和断接
实验目的
了解和熟悉共享存储机制
实验内容
编制一长度为1k的共享存储区发送和接收的程序。
程序设计
(1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。
(2)SERVER端建立一个key为75的共享区,并将第一个字节设置为-1,。作为数据空的标志。等待其他进程发来的消息。当字节的值发生变化时,表示收到了信息,进行处理。然后再次把它的值设为-1。如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个数据后显示“(server)receive”。
(3)CLIENT端建立一个key 为75的共享区,当共享取得第一个字节为-1时,Server端空闲,可发送请求。CLIENT随即填入9到0。期间等待server端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发出一次数据后显示“(client)sent”。
(4)父进程在SERVER和CLIENT均退出后结束。
实现代码
#include
#include
#include
#include
#include
#include
#define SHMKEY 75
int shmid,i;
int *addr;
void client( )
{ int i;
shmid=shmget(SHMKEY,1024,0777); /*打开共享存储区*/
addr=shmat(shmid,0,0); /*获得共享存储区首地址*/
for (i=9;i>=0;i--)
{ while (*addr!=-1);
printf("(client) sentn");
*addr=i;
}
exit(0);
}
void server( )
{
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享存储区*/
addr=shmat(shmid,0,0); /*获取首地址*/
do
{
*addr=-1;
while (*addr==-1);
printf("(server) receivedn");
}while (*addr);
shmctl(shmid,IPC_RMID,0); /*撤消共享存储区,归还资源*/
exit(0);
}
main( )
{
while ((i=fork( ))==-1);
if (!i) server( );
system("ipcs -m");
while ((i=fork( ))==-1);
if (!i) client( );
wait(0);
wait(0);
}
结果显示
[stu@localhost ~]$ gcc 123.c
[stu@localhost ~]$ ./
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 3014658 stu 600 393216 2 dest
0x00000000 3047428 stu 600 393216 2 dest
0x00000000 3080197 stu 600 393216 2 dest
0x00000000 3112966 stu 600 393216 2 dest
0x00000000 3145735 stu 600 393216 2 dest
0x00000000 3178504 stu 600 393216 2 dest
0x00000000 3211273 stu 600 393216 2 dest
0x00000000 3604490 stu 600 393216 2 dest
0x00000000 3276811 stu 600 393216 2 dest
0x00000000 3309580 stu 600 393216 2 dest
0x00000000 3833869 stu 600 393216 2 dest
0x00000000 3670030 stu 600 393216 2 dest
0x00000000 3702799 stu 600 1981788 2 dest
0x00000000 3768336 stu 600 393216 2 dest
0x0000004b 3899409 stu 777 1024 1
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
(client) sent
(server) received
实验分析
出现上述应答延迟的现象是程序设计的问题。当client端发送了数据后,并没有任何措施通知server端数据已经发出,需要由client的查询才能感知。此时,client端并没有放弃系统的控制权,仍然占用CPU的时间片。只有当系统进行调度时,切换到了server进程,再进行应答。这个问题,也同样存在于server端到client的应答过程中。
本文发布于:2024-02-07 12:02:28,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170727854964749.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |